首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通配符泛型类型和泛型类型之间未经检查的强制转换

通配符泛型类型和泛型类型之间未经检查的强制转换
EN

Stack Overflow用户
提问于 2015-02-19 16:37:55
回答 2查看 1.8K关注 0票数 3

请帮助我理解为什么这个演员是不受约束的:

代码语言:javascript
复制
 List<? extends String> t= ...;
 List<String> t2=(List<String>)t;

应该是完全安全的。我想这个可能已经被问过了,但我找不到.关于仿制药的问题太多了!我经常使用仿制药,但这种怀疑一直存在.提前谢谢你。

编辑:正如所指出的,我应该使用非期末课程。所以:

代码语言:javascript
复制
List<? extends ConfigurationAdapter> t= new ArrayList<DATASOURCE_ConfigurationAdapter>();
List<ConfigurationAdapter> t2=(List<ConfigurationAdapter>)t;

这个很管用。我不明白为什么不加检查。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-19 16:51:02

我想有一个例子可以解释发出警告的原因。

但是让我们使用其他类型,因为字符串在Java中实际上不能有子类型。

代码语言:javascript
复制
List<Integer> integers = new ArrayList<>(asList(1,2,3,4,5));
List<? extends Number> anyNumbers = integers;

现在,假设我们强迫你所做的演员,想象一下你甚至可以在没有警告的情况下去做。

代码语言:javascript
复制
List<Number> numbers = (List<Number>) anyNumbers;

现在你可以这样做:

代码语言:javascript
复制
numbers.add(3.5);

稍后,在代码中的其他地方,有人试图像这样使用原始集合:

代码语言:javascript
复制
for(Integer myInt: integers) { //ClassCastException

}

您得到了一个ClassCastException,因为您现在已经打破了对类型系统的期望。原始集合应该只接受整数,但是您已经成功地欺骗了Java,使它接受任何类型的数字,在这种情况下是双倍的。当然,当您迭代原始集合,期待整数时,当您找到一个实际上不是整数的集合时,您的代码将失败。

这就是为什么编译器抛出警告是合乎逻辑的,这也是为什么不听它的警告是危险的。字符串是Java中的最后一个类,这就是为什么在您的特殊情况下,您可能找不到在这个问题中结束的任何场景。但在其他情况下,这可能是一种可能性。

票数 4
EN

Stack Overflow用户

发布于 2015-02-19 16:40:22

对于String来说,它是完全安全的,您可以忽略这个警告。对于类型是final class类型的任何类型绑定也是如此。

对于任何其他类型,分配给t的值的类型可能是List<SubtypeOfTheBound>。在这种情况下,不能将其分配给List<Bound>

更多阅读:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28611822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档