2012-06-29 13 views
10

yapar: "dönüş türleri olarak joker türlerini kullanmak yerine onları zorlayacaktır kullanıcılar için daha fazla esneklik sağlayan vermeyin. İstemci kodunda joker karakterlerini kullanmak. "Neden Etkili Java Second Edition, Madde 28 Gönderen Guava en TypeToken <T> .getRawType() dönüş Class <? super T> yerine Class <T>

public final Class<? super T> getRawType() 

Sadece ben yazıyorum kod parçası var son kontrolsüz döküm uyarıyı anlamak için jenerik joker karakterler ile sardı alıyorum ve getRawType() bir joker türü verir neden anlamıyorum.

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

Ben bir

Class<? super ? extends Base<C>> 

cevap

7

Bir TypeToken<ArrayList<String>> varsa ve Class<ArrayList> (, ham türü) almak istiyorsanız. Class<T>'u döndürdüyse,'u Class<ArrayList> olmasını istemez.

+0

Teşekkürler @newacct, işte bu Anlamadım ama ArrayList 'un ArrayList'i genişletmesi mantıklı. Sınıfı, ne geri döndüğüne dair açıklayıcıdır, ancak müşteri kodu söz konusu olduğunda, her zaman sizin de yayınlamanız gerektiğinden, Class 'u iade edebilir. – MikeB

0

döndürür olarak "belirteç" nin genel tür (yani S eğer

TypeToken<S> 
bir Tip sınıfı ise token.getRawType() dökme zorunda

bir java.lang.reflect.Type sınıfıdır, sonra TypeToken.getRawType(), S ile ilişkili ham türü döndürecektir. Bu, bir Class nesnesi olmalıdır, S.

TypeToken kaynak koduna bakın. , Uygulanan strateji çalışmaz ve bir ham türüne sahip (birden sınırları olması gibi) Bazı durumlarda

is Ok: ham tip

Object.class

olmak Mesela MoreTypes için bakınız olacaktır:

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

Kaynağı okudum ama yine de S ailesinin döndüğü bir durum bulamıyorum. Yeni TypeToken () {}. GetRawType() 'ı denedim ancak bu bir wildcardType sınıfı döndürür, herhangi bir üst öğe değil – MikeB

+1

' TypeToken 'bağlantınızın gson sürümüne işaret ettiğini unutmayın. İşte Guava sürümü: http://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/reflect/TypeToken.java –

İlgili konular