Last active
August 4, 2019 23:37
-
-
Save dfparker2002/9b0bc2d95c61c65af1fb54776bfe1e5b to your computer and use it in GitHub Desktop.
Generic examples
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//src: https://github.com/eugenp/tutorials/blob/887eeaf802e0b8728ec9367ad23495303f9a1f38/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java | |
import java.util.ArrayList; | |
import java.util.Arrays; | |
import java.util.List; | |
import java.util.function.Function; | |
import java.util.stream.Collectors; | |
public class Generics { | |
// definition of a generic method | |
public static <T> List<T> fromArrayToList(T[] a) { | |
return Arrays.stream(a).collect(Collectors.toList()); | |
} | |
// definition of a generic method | |
public static <T, G> List<G> fromArrayToList(T[] a, Function<T, G> mapperFunction) { | |
return Arrays.stream(a).map(mapperFunction).collect(Collectors.toList()); | |
} | |
// example of a generic method that has Number as an upper bound for T | |
public static <T extends Number> List<T> fromArrayToListWithUpperBound(T[] a) { | |
return Arrays.stream(a).collect(Collectors.toList()); | |
} | |
// example of a generic method with a wild card, this method can be used | |
// with a list of any subtype of Building | |
public static void paintAllBuildings(List<? extends Building> buildings) { | |
buildings.forEach(Building::paint); | |
} | |
public static List<Integer> createList(int a) { | |
List<Integer> list = new ArrayList<>(); | |
list.add(a); | |
return list; | |
} | |
public <T> List<T> genericMethod(List<T> list) { | |
return list.stream().collect(Collectors.toList()); | |
} | |
public List<Object> withErasure(List<Object> list) { | |
return list.stream().collect(Collectors.toList()); | |
} | |
} | |
// src: https://github.com/eugenp/tutorials/blob/887eeaf802e0b8728ec9367ad23495303f9a1f38/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/generics/GenericsUnitTest.java | |
import org.junit.Test; | |
import java.util.ArrayList; | |
import java.util.List; | |
import static org.hamcrest.CoreMatchers.hasItems; | |
import static org.hamcrest.CoreMatchers.is; | |
import static org.hamcrest.MatcherAssert.assertThat; | |
import static org.junit.Assert.fail; | |
public class GenericsUnitTest { | |
// testing the generic method with Integer | |
@Test | |
public void givenArrayOfIntegers_thanListOfIntegersReturnedOK() { | |
Integer[] intArray = { 1, 2, 3, 4, 5 }; | |
List<Integer> list = Generics.fromArrayToList(intArray); | |
assertThat(list, hasItems(intArray)); | |
} | |
// testing the generic method with Integer and String type | |
@Test | |
public void givenArrayOfIntegers_thanListOfStringReturnedOK() { | |
Integer[] intArray = { 1, 2, 3, 4, 5 }; | |
List<String> stringList = Generics.fromArrayToList(intArray, Object::toString); | |
assertThat(stringList, hasItems("1", "2", "3", "4", "5")); | |
} | |
// testing the generic method with String | |
@Test | |
public void givenArrayOfStrings_thanListOfStringsReturnedOK() { | |
String[] stringArray = { "hello1", "hello2", "hello3", "hello4", "hello5" }; | |
List<String> list = Generics.fromArrayToList(stringArray); | |
assertThat(list, hasItems(stringArray)); | |
} | |
// testing the generic method with Number as upper bound with Integer | |
// if we test fromArrayToListWithUpperBound with any type that doesn't | |
// extend Number it will fail to compile | |
@Test | |
public void givenArrayOfIntegersAndNumberUpperBound_thanListOfIntegersReturnedOK() { | |
Integer[] intArray = { 1, 2, 3, 4, 5 }; | |
List<Integer> list = Generics.fromArrayToListWithUpperBound(intArray); | |
assertThat(list, hasItems(intArray)); | |
} | |
// testing paintAllBuildings method with a subtype of Building, the method | |
// will work with all subtypes of Building | |
@Test | |
public void givenSubTypeOfWildCardBoundedGenericType_thanPaintingOK() { | |
try { | |
List<Building> subBuildingsList = new ArrayList<>(); | |
subBuildingsList.add(new Building()); | |
subBuildingsList.add(new House()); | |
// prints | |
// Painting Building | |
// Painting House | |
Generics.paintAllBuildings(subBuildingsList); | |
} catch (Exception e) { | |
fail(); | |
} | |
} | |
@Test | |
public void givenAnInt_whenAddedToAGenericIntegerList_thenAListItemCanBeAssignedToAnInt() { | |
int number = 7; | |
List<Integer> list = Generics.createList(number); | |
int otherNumber = list.get(0); | |
assertThat(otherNumber, is(number)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment