【发布时间】:2020-10-15 16:39:51
【问题描述】:
假设我们有一个类 A 和一个类 B,它继承自类 A。 假设我们有:
Set<A> setOfAs = new HashSet<>();
以下铸造:
((Set<B>) setOfAs)
会给我们运行时错误。
但是,如果我们使用通配符并定义以下集合:
Set<? extends A> setOfAs = new HashSet<>();
我们可以毫无问题地进行选角:
((Set<B>) setOfAs)
为什么允许转换通配符的集合,而禁止转换“常规”类型的集合?
【问题讨论】:
-
“我们没有问题”你有一个未经检查的演员,不是吗?
Set<? extends A>可能是Set<B>;但是Set<A>不能同时是Set<B>。 -
"会给我们一个运行时错误" — 我认为你的意思是一个编译时错误。
-
简而言之:在第一个代码sn-p中,编译器知道代码总是错误的(即
Set<A>永远不能转换为Set<B>);在第二个代码 sn-p 中,可能会出现这种情况有效,因此编译器只会发出警告,但不会发出错误。
标签: java