JavaGenerics - typ anhand einer Methode ermitteln

NetBull

Erfahrenes Mitglied
Hi,

arbeite mich seit geraumer Zeit in Java ein und habe ein Problem bei der Syntax gernerischer Typen.

Beispiel Code für den Aufruf:
Code:
MyCollection<TestItem> Tests = new MyCollection<TestItem>();
MyCollection<AnderesItem> Tests = new MyCollection<AnderesItem>();
Beide Konstellationen sollen gehen, soweit noch einfach...
Beide Item Typen sind von MyItem abgeleitet.

Anhand der verwendeten Typen der Collection soll diese aber mit unterschiedlichen DataAccessObjects arbeiten:
Code:
public class MyCollection<T extends MyItem >
{	
	private List<MyItem > cDataCollection;
	Dao<T> dataAccessObject;
	
	public InfraCollection()
	{		
		// hier dann mein Problem:
		this.dataAccessObject = DataAccessObjectFactory.getDao(  ****?  );
	}
	
	//....
	
}
und genau hier <****?> komme ich nicht weiter. Wie übergebe ich von welchem Typ der Typ nun ist?
Also das was im ersten Code Beispiel entweder mit <TestItem> oder mit <AnderesItem> verwendet wurde, da sich hier das DataAccessObject unterscheidet welches von DataAccessObjectFactory ermittelt und dann zurückgegeben werden soll....

Code:
public class DataAccessObjectFactory
{
	// würde auch gerne ohne SupressWarnings unterwegs sein *lächel*
	@SuppressWarnings("unchecked")
	 public static <T extends MyItem> Dao<T> getDao(Class<T> type) 
	  {
		if (type.equals(TestItem.class))
		{
			return ((Dao<T>) new TestItemDao());
		}
		else if (type.equals(AnderesItem.class))
		{
			return ((Dao<T>) new AnderesItemDao());
		}
		throw new IllegalStateException("requested type '" + type.getCanonicalName() + "' not supported");
	 }
}

Hoffe ich habe das komplex genug beschrieben das mir jemand helfen kann.
Zusammengefasste Problemdarstellung:
1. Wie müsste das hier lauten:?
Code:
this.dataAccessObject = DataAccessObjectFactory.getDao(  ****?  );

2. Wie muss ich den Code im letzten Block abändern, das ich keine Warnungen unterdrücken muss
Code:
@SuppressWarnings("unchecked")

LG deAndro!
 

slowfly

Erfahrenes Mitglied
Hallo

Was wir in unserem AbstractDAO machen:
Code:
ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
return (Class<?>) parameterizedType.getActualTypeArguments()[0];

AbstractDAO Klassendefinition:
Code:
public abstract class AbstractDAO<T extends BusinessModel> implements DAO<T> {

Gruss
slowy
 

NetBull

Erfahrenes Mitglied
hmm.. irgendwie bekomm ich meinen Code nicht dazu damit zu laufen.
Kannst mir das mal an meinem konkreten Beispiel demonstrieren?