为什么Guava的TypeToken .getRawType()返回Class 而不是Class

从Effective Java Second Edition,第28项:“不要使用通配符类型作为返回类型。它不会为用户提供额外的灵活性,而是迫使他们在客户端代码中使用通配符类型。”

public final Class getRawType() 

我刚刚开始掌握通用通配符,以了解我在编写的一段代码中的最后一次未经检查的强制转换警告,我不明白为什么getRawType()返回一个通配符类型。

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

我必须在返回一个时抛出token.getRawType()

 Class<? super ? extends Base> 

如果你有一个TypeToken>并且想要获得Class (这原始类型),该怎么办? 如果它返回Class ,那么它将返回Class> ,它不是你想要的Class

如果“token”的generics类型是Type类(即,如果是S in

 TypeToken 

是一个java.lang.reflect.Type类,然后TypeToken.getRawType()将返回与S关联的原始类型。它应该是一个Class对象,S的父类。

查看TypeToken的源代码。

在某些情况下(比如有多个边界),实现的策略不起作用,原始类型为Ok:原始类型为Object.class

例如,参见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 { ... }