2012-06-29 16 views
10

Da Effective Java Seconda edizione, punto 28: "Non usare tipi jolly come tipi di ritorno Piuttosto che garantisce una maggiore flessibilità per gli utenti li costringerebbe. utilizzare i caratteri jolly nel codice client. "Perché di Guava TypeToken <T> .getRawType() ritorno Classe <? super T> invece di Classe <T>

public final Class<? super T> getRawType() 

Sono appena stato alle prese con caratteri jolly generici per capire l'ultimo avvertimento getto incontrollato che ho in un pezzo di codice che sto scrivendo e non capisco il motivo per cui getRawType() restituisce un tipo jolly.

class Base<T>{} 
class Child<T> extends Base<T>{} 

public <C> void test (TypeToken<? extends Base<C>> token) { 
    Class<? extends Base<C>> rawType = (Class<? extends Base<C>>) token.getRawType(); 
} 

devo lanciare token.getRawType(), in quanto restituisce un

Class<? super ? extends Base<C>> 

risposta

7

Cosa succede se si dispone di un TypeToken<ArrayList<String>> e si desidera ottenere (che è il tipo grezzo). Se restituisse Class<T>, restituirebbe Class<ArrayList<String>> che non è Class<ArrayList> che si desidera.

+0

Grazie a @newacct, questa è la cosa Non ho capito, ma ha senso che ArrayList estenda ArrayList. La classe è descrittiva di ciò che viene restituito anche se per quanto riguarda il codice client potrebbe anche restituire la classe , poiché sarà sempre necessario eseguirla. – MikeB

0

Se il tipo generico di "token" è una classe tipo (cioè se S in

TypeToken<S> 

è una classe java.lang.reflect.Type, quindi TypeToken.getRawType() restituirà il tipo non elaborato associato a S. Deve essere un oggetto di classe, padre di S.

Vedere il codice sorgente di TypeToken.

In alcuni casi (come avere più limiti), la strategia implementata non funzionerà e avente un tipo grezzo è OK: il tipo grezzo sarà Object.class

veda ad esempio MoreTypes:

public static Class<?> getRawType(Type type) { 
... 
} else if (type instanceof TypeVariable) { 
    // we could use the variable's bounds, but that'll won't work if there are multiple. 
    // having a raw type that's more general than necessary is okay 
    return Object.class; 

} else { 
... 
} 
+0

Ho letto il codice sorgente ma non riesco ancora a trovare una situazione in cui viene restituito un genitore di S. Ho provato 'new TypeToken () {}. GetRawType()' ma restituisce una classe di WildcardType, non un qualsiasi genitore – MikeB

+1

Nota che il tuo link "TypeToken" punta alla versione gson. Ecco la versione di Guava: http://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/reflect/TypeToken.java –

Problemi correlati