10 Stimmen

Initialisierung der Variablen. Ich kenne ihren Typ nicht [java]

class pair<U,V>{
U first;
V second;
public pair() {
    first = new U(); //error
    second = new V(); //error
}   
public pair(U f,V s){
    first = f;
    second = s;
}
}

erforderlich: Klasse
gefunden: Typ-Parameter

Ist es möglich, eine Initialisierung first / second mit (ohne Argumente) Konstruktor des Typs U/V auf andere Weise?

8voto

Chris Dennett Punkte 21894

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;
    }
}

1voto

M Platvoet Punkte 1669

Nein, das kann man nicht, die Typen werden in Java gelöscht. Sie sollten also die Konstruktion auf die Aufrufsite verschieben.

CodeJaeger.com

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.

Powered by:

X