为什么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 { ... }