铸造Java对象泛型类型与已知类型参数

问题描述:

我有一个泛型类是这样的:铸造Java对象泛型类型与已知类型参数

public class Box<T> { 
    ... 
} 

代码后来我想投一个对象给Box类是这样的:

Box<String> boxString = (Box<String>) object; 

但是编译器和IDE在这里发出警告。
可以通过不使用@SuppressWarnings以某种方式干净地避免警告吗?

+1

都能跟得上。 Java有类型擦除,所以泛型不能在运行时检查。唯一真正的解决方案是避免强制转换为Object。 – Nayuki

+1

这个警告是一件好事。它告诉你,转换的类型参数部分不会在运行时进行类型检查。如果你确定知道它总是有效的演员阵容,那么使用'@SuppressWarnings(“unchecked”)'是合理的。 –

如果object的类型是Object,那么除了加入@SuppressWarnings("unchecked")之外,您无法避免该警告。

警告并非错误,如果您了解它们,则可以在代码中包含一些代码。

编辑:如注释建议,将"unchecked"添加到注释中。

+1

具体来说,'@SuppressWarnings(“unchecked”)'。 –

该警告是一件好事。它告诉你,转换的类型参数部分不会在运行时进行类型检查。如果你确定知道它总是有效的演员阵容,那么使用@SuppressWarnings("unchecked")是合理的。

但是,避免警告比抑制它们要好。

如果您控制稍后需要投射的Box实例的构造,则可以对Box进行子类化,因为它不是最终的。现在

public class BoxString extends Box<String> { 
    ... 
} 

你可以不投泛型:

if (object instanceof BoxString) { 
    BoxString boxString = (BoxString) object; 
    ... 
}