为什么会这样:
public <T> List<byte[]> getData(T data) {
Location loc = (Location) data;
// ...
}
不会产生任何警告,同时:
public <T> List<byte[]> getData(T data) {
List<ScanResult> scanRes = (List<ScanResult>) data;
// ...
}
生成 Type safety: Unchecked cast from T to List<ScanResult>
?
如何解决警告?
作为设计,这种方法声明是否有味道?
public <T> List<byte[]> getData(T data)
是在不同数据类型的不同类中实现的接口(interface)方法——所有实现的第一行都是这样的转换
最佳答案
您收到警告是因为强制转换 (List<ScanResult>) data
不安全。由于 type erasure , List<ScanResult>
将是 List
在运行时,因此不会对列表的元素类型进行真正的类型检查。也就是说,即使您得到 List<String>
,该转换也会成功。作为参数,稍后您将获得 ClassCastException
当您尝试访问列表时:
ScanResult result = data.get(0); // ClassCastException: String
避免它的一种方法是使接口(interface)通用:
public interface DataProvider<T> {
public List<byte[]> getData(T data);
}
然后在实现中定义具体的类型参数:
public class DataProviderFromLocation implements DataProvider<Location> {
public List<byte[]> getData(Location data) {
}
}
public class DataProviderFromScanResultList implements DataProvider<List<ScanResult>> {
public List<byte[]> getData(List<ScanResult> data) {
}
}
不知道适不适合你的需求。
关于java - 转换到 List<SomeType> 发出未经检查的转换警告,而转换到 SomeType 则不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18705482/