当我使用以下代码时,我的IDE会生成警告:
aMethod(List.class);
“类型安全:类型列表的表达式需要未经检查的转换以符合......” 可悲的是,当我尝试让IDE修复它时,它不起作用。推断泛型类型的正确语法是什么?请提前获取任何帮助。
编辑:
方法签名:
public static <T> T aMethod(Class<T> clazz)
让我们简单一点,说我想引用的类型是String
。
裤裤
答案 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>
。
另见