2013-02-24 7 views
6

Ich verwende die Guava TypeToken Klasse, um zu testen, ob Instanzen eines beliebigen Typs Objekten eines anderen Typs zugewiesen werden können.Guava's TypeToken.isAssignableFrom-Methode verstehen

Im folgenden Code-Schnipsel, teste ich, wenn Typen wie List zuweisbare von List<String> sind deklariert, und umgekehrt:

TypeToken rawListType = new TypeToken<List>(){}; 
TypeToken parameterizedListType = new TypeToken<List<String>>(){}; 
System.out.println(rawListType.isAssignableFrom(parameterizedListType)); //true 
System.out.println(parameterizedListType.isAssignableFrom(rawListType)); //false 

Warum der zweite Aufruf von isAssignableFrom kehrt false gegeben, dass der folgende Code nicht kompiliert , so kann ich List<String> von List (mit einer Warnung) zuweisen:

List l = null; 
List<String> l2 = null; 
l = l2; 
l2 = l; //Type Safety Warning 

Meine Intuition ist, dass Guava wenn in beantwortet Diese Typen sind ohne Warnung (?) zuweisbar. Wenn das korrekt ist, wie könnte ich überprüfen, ob Assignability im Sinne des Compilers mir erlaubt, ein Objekt zu einem anderen zuzuordnen (mit oder ohne Warnungen), wie es im zweiten Codeausschnitt gezeigt wird ?.

Antwort

3

Wie Sie bereits gesagt haben, wissen wir, dass der Compiler die Zuweisung eines generischen Typs von einem unformatierten Typ ermöglicht, aber das bedeutet keine Zuweisbarkeit. Der Compiler macht eine implizite unkontrollierte Umwandlung (daher die Warnung).

Da Sie wirklich die Zuordnungsfähigkeit der entsprechenden Rohtypen überprüfen möchten, können Sie einfach TypeToken.getRawType verwenden und dann Class.isAssignableFrom verwenden.

EDIT: Wie Sie wies darauf hin, würde diese Methode zählen List<Integer> und List<String> zuordenbar und voneinander. Um dies zu vermeiden, benötigen Sie eine allgemeinere Lösung:

Beachten Sie, dass diese Lösung Array-Typen nicht berücksichtigt.

+0

Hallo @ Paul. Es ist nicht genau das, wonach ich suche, wenn ich die Zuweisbarkeit von Rohtypen überprüfe, dann wäre die Liste zuweisbar von der Liste und so weiter, und dies ist nicht korrekt. Ich bin auf der Suche nach einer Möglichkeit, die Zuweisbarkeit zu überprüfen, selbst in Fällen, in denen der Compiler implizite Umwandlungen hinter den Courtains hinzufügen müsste. – Sergio

+0

Verstanden - siehe mein Update. –

+0

Ihre Lösung scheint mir korrekt zu sein, haben Sie eine Idee, warum TypeToken das nicht tut? Zumindest sollten sie dies in der Methode Javadoc dokumentiert haben, denke ich. – Sergio