Java erlaubt dies normalerweise nicht wegen der Typenlöschung . Sie können Konstruktorargumente vom Typ Class<U>
y Class<V>
, für die Sie konkrete Klassentypen der gegebenen Typparameter übergeben würden (d.h., Integer.class
y String.class
für <Integer>
y <String>
).
Es ist auch möglich, den Typ mit Hilfe von Reflexion auf Bytecode-Ebene zu extrahieren, aber das ist ziemlich kompliziert und funktioniert nicht immer und in allen Situationen. Wenn Sie auf dieser Artikel finden Sie das Beispiel, das dies möglich macht. Ich habe es der Einfachheit halber unten eingefügt.
static public Type getType(final Class<?> klass, final int pos) {
// obtain anonymous, if any, class for 'this' instance
final Type superclass = klass.getGenericSuperclass();
// test if an anonymous class was employed during the call
if ( !(superclass instanceof Class) ) {
throw new RuntimeException("This instance should belong to an anonymous class");
}
// obtain RTTI of all generic parameters
final Type[] types = ((ParameterizedType) superclass).getActualTypeArguments();
// test if enough generic parameters were passed
if ( pos < types.length ) {
throw RuntimeException(String.format("Could not find generic parameter #%d because only %d parameters were passed", pos, types.length));
}
// return the type descriptor of the requested generic parameter
return types[pos];
}
Edit: als Antwort auf den Kommentar:
class pair<U,V>{
U first;
V second;
public pair(Class<U> cu, Class<V> cv) {
try {
first = cu.newInstance();
second = cv.newInstance();
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
}
public pair(U f,V s){
first = f;
second = s;
}
}