Klasse des Typparameters T

darkmagic2002

Mitglied
Hallo zusammen,
meine generische Klasse MyClass
Java:
public class MyClass<T extends Number>
{
      T toTypeT(String str)
      {
             //wenn Typparameter T Integer ist
             return Integer.parseInt(str);
             
             //wenn Typparameter T Float ist
             return Float.parseFloat(str);

             //evtl. usw.
      }
}
soll so spezialisiert sein, dass die Methode toTypeT(String) ein Objekt der Klasse des Typparameters T zurückgibt. Dabei reicht es nicht, wenn die Methode ein in nach Number gecastetes Objekt zurückgibt.
Ich würde gerne wissen, wie man die Klasse von T zur Laufzeit erfragen kann. Wahrscheinlich liege ich mit Reflection richtig. Hat jemand dazu den Code, da ich mich mit Reflection noch nicht auseinandergesetzt habe.
Dankeschön im Vorraus,
kevin
 
Hallo,

mit folgendem Code kannst du dir zumindest schon mal den Typ / den Klassennamen von "T" holen:
Java:
public class MyClass<T extends Number> {
	public T toTypeT(String str) {
		String typeOfT = "";
		
		for(TypeVariable<?> generics : this.getClass().getTypeParameters())
			for(Type typ : generics.getBounds())
				if(generics.getName().equals("T"))
					typeOfT = typ.toString().split(" ")[1];
		
		System.out.println(typeOfT);
		return null;
	}
	
	public static void main(String[] args) {
		new MyClass<Integer>().toTypeT("13");
	}
}

Hier liefert er natürlich (siehe Ausgabe) "java.lang.Number". Warum das? Nun, die Klasse weiß zur Laufzeit nur, dass eine Number las Typparameter angegeben wurde und nicht ob der angegebene Typ nur davon geerbt hat. Dies ist auch nicht weiter schlimm, denn du kannst ja auf den Typparameter eh nur durch casten oder so zugreifen, du hast ja keine Instanz des Typparameters.

Um herauszufinden, welche Subklasse von Number übergeben wurde, musst du (meines Wissens nach) mit instanceof oder einen Vergleich der Klassen die einzelnen Fälle durchgehen. Zum Beispiel so:
Java:
public class MyClass<T extends Number> {
	private Class<? extends Number> myType = null;
	
	public MyClass(Class<? extends Number> myType ) {
		this.myType = myType;
	}

	@SuppressWarnings("unchecked")
	public T toTypeT(String str) {
		if(myType == Integer.class) {
			return (T) new Integer(Integer.parseInt(str));
		}
		
		if(myType == Double.class) {
			return (T) new Double(Double.parseDouble(str));
		}
		
		if(myType == Float.class) {
			return (T) new Float(Float.parseFloat(str));
		}
		
		// usw...
		return null;
	}
	
	public static void main(String[] args) {
		MyClass<Integer> test = new MyClass<Integer>(Integer.class);
		Number n = test.toTypeT("13");
		
		System.out.println(n.getClass() + ": " + n.toString());
	}
}

Wo der Sinn des Ganzen liegt, weiß ich nicht ;) Eventuell kann es jemand besser erklären :D

Gruß
BK
 
Zuletzt bearbeitet:
Hallo Bratkartoffel,
vielen Dank für die Antwort. Genau das habe ich gesucht! Vor allem dein zweites Beispiel hat mir sehr geholfen:D.
Grüße kevin
 

Neue Beiträge

Zurück