Even after a few years writing principally in Java, I struggle to master the finer points of this topic. Here's an example to help.
package com.windofkeltia;
import java.util.ArrayList;
import java.util.List;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.junit.runners.MethodSorters;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@FixMethodOrder( MethodSorters.NAME_ASCENDING )
public class GenericsTest
{
@Before public void setUp() { buildPojoList(); }
private List< Pojo > pojoList;
@Test
public void testWalkAllPojos()
{
System.out.println( "Walk all the POJOs in our list:" );
for( Pojo pojo : pojoList )
System.out.println( "[" + pojo.getClass().getSimpleName() + "] " + pojo.toString() );
}
/** Extract a patient POJO from the list. */
@Test
public void testExtractTheFirstPatient()
{
Patient patient = ( Patient ) extractPojo( Patient.class, pojoList );
assertTrue( patient instanceof Patient );
System.out.println( "Found patient " + patient.toString() );
}
/** Extract the list of address POJOs (there are multiple) from the list. */
@Test
public void testExtractAllAddressPojos()
{
List< Address > addresses = extractPojos( Address.class, pojoList );
assert addresses != null;
assertEquals( addresses.size(), 2 );
System.out.println( "Found addresses:" );
for( Address address : addresses )
System.out.println( address.toString() );
}
/** Extract a reference to the first POJO of the given type from the list. */
public static Pojo extractPojo( Class< ? extends Pojo > clazz, List< Pojo > pojoList )
{
for( Pojo pojo : pojoList )
{
if( pojo.getClass() == clazz )
return pojo;
}
return null;
}
/** Create a list of references of the given type extracted from the list. */
public static < T > List< T > extractPojos( Class< T > clazz, List< Pojo > pojoList )
{
List< T > pojos = new ArrayList<>();
for( Pojo pojo : pojoList )
{
if( pojo.getClass() == clazz )
pojos.add( ( T ) pojo );
}
return( pojos.size() > 0 ) ? pojos : null;
}
private void buildPojoList()
{
pojoList = new ArrayList<>();
pojoList.add( new Address( "3620 Bedford Drive", "Missoula" ) );
pojoList.add( new Telephone( "801 295-9626", "home" ) );
pojoList.add( new Patient( "Jim", "Davis" ) );
pojoList.add( new Address( "568 Mulberry Avenue", "Pottersville" ) );
pojoList.add( new Patient( "Bill", "Watterson" ) );
}
static class Pojo
{
long x = System.currentTimeMillis();
}
static class Address extends Pojo
{
String street;
String city;
public Address( String street, String city )
{
super();
this.street = street;
this.city = city;
}
public String toString() { return street + ", " + city; }
}
static class Telephone extends Pojo
{
String number;
String type;
public Telephone( String number, String type )
{
super();
this.number = number;
this.type = type;
}
public String toString() { return number + " (" + type + ")"; }
}
static class Patient extends Pojo
{
String firstname;
String lastname;
public Patient( String firstname, String lastname )
{
super();
this.firstname = firstname;
this.lastname = lastname;
}
public String toString() { return firstname + " " + lastname; }
}
}
Output:
Test: testWalkAllPojos ------------------------------------------------------------------------------------ Walk all the POJOs in our list: [Address] 3620 Bedford Drive, Missoula [Telephone] 801 295-9626 (home) [Patient] Jim Davis [Address] 568 Mulberry Avenue, Pottersville [Patient] Bill Watterson Test: testExtractTheFirstPatient -------------------------------------------------------------------------- Found patient Jim Davis Test: testExtractAllAddressPojos -------------------------------------------------------------------------- Found addresses: 3620 Bedford Drive, Missoula 568 Mulberry Avenue, Pottersville