10

来自 Effective Java Second Edition,第 28 条:“不要使用通配符类型作为返回类型。与其为您的用户提供额外的灵活性,不如强制他们在客户端代码中使用通配符类型。”

public final Class<? super T> getRawType()

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

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

我必须转换 token.getRawType() 因为它返回一个

Class<? super ? extends Base<C>>
4

2 回答 2

8

如果您有 aTypeToken<ArrayList<String>>并且想要获得Class<ArrayList>(即原始类型)怎么办。如果它返回Class<T>,那么它会返回Class<ArrayList<String>>,这不是Class<ArrayList>你想要的。

于 2012-06-29T18:40:06.290 回答
0

如果“token”的泛型类型是 Type 类(即如果 S 在

TypeToken<S>

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

请参阅TypeToken的源代码。

在某些情况下(例如有多个边界),实现的策略将不起作用并且具有原始类型是可以的:原始类型将是 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 {
...
}
于 2012-06-29T12:57:12.517 回答