Java泛型推断类型

时间:2010-07-06 11:59:33

标签: java generics

当我使用以下代码时,我的IDE会生成警告:

aMethod(List.class);

“类型安全:类型列表的表达式需要未经检查的转换以符合......” 可悲的是,当我尝试让IDE修复它时,它不起作用。推断泛型类型的正确语法是什么?请提前获取任何帮助。

编辑:

方法签名:

public static <T> T aMethod(Class<T> clazz)  

让我们简单一点,说我想引用的类型是String

裤裤

2 个答案:

答案 0 :(得分:3)

如果您只想从代码中删除警告:

aMethod(Class<?> clazz);

对于继承Collection类的类,您可以使用以下内容:

public <T extends Collection<?>> void clazz(Class<T> clazz);

答案 1 :(得分:1)

List.class就是所谓的原始类型。

泛型使用类型擦除从已编译的代码中删除参数化类型。类型安全检查仅在编译时完成。它是编译器,确保您只将字符串添加到列表中。

在运行时,字符串消失了,您的List<String>功能与预先通用列表完全相同。因此,您将其传递给一个方法,该方法试图猜测T中的List<T>是什么。但它永远无法确定这一点,因为信息将会消失。

由于类型无法匹配,编译器会警告您,您的代码可能允许对列表进行非类型安全访问。也就是说,由于List<String>List<Integer>在运行时被视为相同,并且都由List.class表示,因此您可能会在运行时为您的代码尝试将String添加到失败的List<Integer>

另见

Generics in the JLS

相关问题