2013-02-24 18 views
6

Używam klasy Guava TypeToken do sprawdzenia, czy instancje dowolnego typu można przypisać do obiektów innego typu.Opis metody Guava TypeToken.isAssignableFrom

W poniższym fragmencie kodu, mam testowanie jeśli typy zadeklarowane jako List są przypisywane z List<String>, i na odwrót:

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 

Dlaczego drugie wywołanie isAssignableFrom zwrotów false, biorąc pod uwagę, że kod poniżej nie skompilować , więc mogę przypisać List<String> z List (z ostrzeżeniem):

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

Moja intuicja jest taka, że ​​jeśli Guava odpowiada ins typy te można przypisać bez ostrzeżeń (?). Jeśli jest to poprawne, w jaki sposób mogę sprawdzić możliwość przypisania w sensie kompilatora, pozwalając mi przypisać obiekt do innego (z ostrzeżeniami lub bez ostrzeżeń), tak jak jest to pokazane w drugim fragmencie kodu?

Odpowiedz

3

Jak już wspomniano, wiemy, że kompilator pozwoli na przypisanie typu generycznego z typu surowego, ale to nie oznacza przypisania. Kompilator wykonuje ukrytą, niezaznaczoną obsadę (stąd ostrzeżenie).

Ponieważ naprawdę chcesz sprawdzić możliwość przypisania odpowiednich typów surowych, możesz po prostu użyć TypeToken.getRawType, a następnie użyć Class.isAssignableFrom.

EDIT: Jak podkreślił, ta metodologia liczyłbym List<Integer> i List<String> przypisane do i od siebie nawzajem. Aby tego uniknąć, potrzebuję bardziej ogólnego rozwiązania:

boolean checkRawAssignability(TypeToken<?> assigned, TypeToken<?> from) { 

    //if from is a raw type, compare raw types instead 
    final Type fromType = from.getType(); 
    if (fromType instanceof Class<?>) { 
     return assigned.getRawType().isAssignableFrom((Class<?>)fromType); 
    } 

    //otherwise use normal methodology 
    return assigned.isAssignableFrom(from); 
} 

Należy zauważyć, że to rozwiązanie nie uwzględnia typów tablic.

+0

Witam @Paul. Nie jest to dokładnie to, czego szukam, jeśli sprawdzę możliwość przypisania typów surowych, lista będzie przypisywana z listy itd., A to nie jest poprawne. Szukam sposobu sprawdzania możliwości przypisania nawet w przypadkach, w których kompilator musiałby dodawać implicite za sądy. – Sergio

+0

Zrozum - zobacz moją aktualizację. –

+0

Twoje rozwiązanie wydaje mi się poprawne, czy masz jakieś pojęcie dlaczego TypeToken tego nie robi? Przynajmniej powinni to udokumentować w metodzie javadoc. – Sergio