gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:28:41 24 4
gpt4 key购买 nike

为什么会这样:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com