gpt4 book ai didi

Java:为什么可以在通配符集合上进行转换?

转载 作者:行者123 更新时间:2023-12-01 10:59:12 25 4
gpt4 key购买 nike

假设我们有一个类 A 和一个从类 A 继承的类 B。
假设我们有:

Set<A> setOfAs = new HashSet<>();
以下类型转换:
((Set<B>) setOfAs)
会给我们运行时错误。
但是,如果我们使用通配符并定义以下集合:
Set<? extends A> setOfAs = new HashSet<>();
我们没有问题进行类型转换:
((Set<B>) setOfAs)
为什么允许转换通配符集合,而禁止转换“常规”类型的集合?

最佳答案

we have no problem to do the casting:


您将收到未经检查的强制转换警告,因此您并不是真的没有问题;只是编译器无法证明它肯定是错误的,并且无法在字节码中添加任何内容以在运行时发现它是错误的事实。
一个 Set<? extends T>Set可以假设所有成员都可以安全地转换为 T没有 ClassCastException .
一个 Set<? super T>将是 Set已知添加 T 是安全的到它而不会引起 ClassCastException在依赖于 Set 中的元素类型的地方(我相信正确的技术术语是不会造成堆污染)。
一个 Set<T>是这两个有界类型的交集:您可以添加 T 的实例到它,并且其中的所有元素都是 T 的实例.
根据这些定义, Set<B>可以充当 Set<? extends A> ,因为任何可以转换为 B 的东西也可以投到 A .
然而,一个 Set<A>不能充当 Set<B> ,因为它可能包含 A 的实例不是 B 的实例.

关于Java:为什么可以在通配符集合上进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62571683/

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