java - 转换到 List<SomeType> 发出未经检查的转换警告,而转换到 SomeType 则不会

标签 java generics casting type-safety

为什么会这样:

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/

相关文章:

matlab - 在 MATLAB 中连接同一父类(super class)的子类数组

java - Realm 生命周期 - 处理 android 中关闭/无效的实例

java - 如何消除 KVM VM 中 java 和 php 进程间进程间通信的 tcp-ip 发送延迟

java - Morphia 默认构造函数和 constructorArgs

java - 用抽象类的子类的对象填充通用列表

java - 有没有一种类型安全的方法可以在 java 中将空列表作为参数传递?

c++ - 常见的 C++ 实现如何处理 static_cast 和 reinterpret_cast

java - 解析后重置Java BufferedReader

java - 如何限制通用数据结构以仅允许特定接口(interface)的元素?

基于 Java Stage 的处理实现