Wie kann ich das erreichen?
public class GenericClass<T>
{
public Type getMyType()
{
//How do I return the type of T?
}
}
Alles, was ich bisher versucht habe, ergibt immer den Typ Object
und nicht der verwendete Typ.
Wie kann ich das erreichen?
public class GenericClass<T>
{
public Type getMyType()
{
//How do I return the type of T?
}
}
Alles, was ich bisher versucht habe, ergibt immer den Typ Object
und nicht der verwendete Typ.
Wie bereits von anderen erwähnt, ist dies nur unter bestimmten Umständen durch Reflexion möglich.
Wenn Sie den Typ wirklich brauchen, ist dies das übliche (typsichere) Umgehungsmuster:
public class GenericClass<T> {
private final Class<T> type;
public GenericClass(Class<T> type) {
this.type = type;
}
public Class<T> getMyType() {
return this.type;
}
}
Ich habe etwas Ähnliches gesehen
private Class<T> persistentClass;
public Constructor() {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
im hibernate GenericDataAccessObjects Ejemplo
Generika sind nicht verifiziert während der Laufzeit. Dies bedeutet, dass die Informationen zur Laufzeit nicht vorhanden sind.
Das Hinzufügen von Generika zu Java unter Beibehaltung der Abwärtskompatibilität war eine Meisterleistung (Sie können das bahnbrechende Papier darüber lesen: Die Zukunft für die Vergangenheit sichern: Generizität in der Programmiersprache Java ).
Es gibt eine umfangreiche Literatur zu diesem Thema, und einige Leute sind unzufrieden mit dem aktuellen Stand, einige sagen, dass es eigentlich ein locken. und es besteht keine wirkliche Notwendigkeit dafür. Sie können beide Links lesen, ich fand sie recht interessant.
Verwenden Sie Guave.
import com.google.common.reflect.TypeToken;
import java.lang.reflect.Type;
public abstract class GenericClass<T> {
private final TypeToken<T> typeToken = new TypeToken<T>(getClass()) { };
private final Type type = typeToken.getType(); // or getRawType() to return Class<? super T>
public Type getType() {
return type;
}
public static void main(String[] args) {
GenericClass<String> example = new GenericClass<String>() { };
System.out.println(example.getType()); // => class java.lang.String
}
}
Vor einiger Zeit habe ich einige vollwertige Beispiele mit abstrakten Klassen und Unterklassen veröffentlicht aquí .
Hinweis: Dies erfordert die Instanziierung einer Unterklasse de GenericClass
damit es den Typ-Parameter korrekt binden kann. Andernfalls gibt es den Typ einfach als T
.
Java-Generika werden hauptsächlich zur Kompilierzeit verwendet, was bedeutet, dass die Typinformationen zur Laufzeit verloren gehen.
class GenericCls<T>
{
T t;
}
wird kompiliert zu etwas wie
class GenericCls
{
Object o;
}
Um die Typinformationen zur Laufzeit zu erhalten, müssen Sie sie als Argument des Ctors hinzufügen.
class GenericCls<T>
{
private Class<T> type;
public GenericCls(Class<T> cls)
{
type= cls;
}
Class<T> getType(){return type;}
}
Exemple :
GenericCls<?> instance = new GenericCls<String>(String.class);
assert instance.getType() == String.class;
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.