原始类型、无界通配符和有界通配符

2024-01-28

我有一个简单的问题如下: 这是关于整个问题的简单示例:

List a = new ArrayList();
List <?> b;
List <? extends Object> c;

根据 khalid mughal 的《Java SCJP》(一本非常好的书!):

a = b; // ok. Widening conversion.
b = a; // ok too. No unchecked warning.

b = c; // ok
c = b; // ok

c=a; // ok but now will issue a unchecked warning. // clause 1

我确实理解,任何原始类型(示例 a)当分配给任何有界通配符引用时,都会发出未经检查的警告(因为该原始类型 a 中的内容可以是任何内容)。

我的问题是,既然 c 是最高的上限(?扩展对象),那么 a 是否应该能够在没有警告的情况下分配给 c ?


如果我正确理解你的问题(我真的不认为我理解),根据说法,似乎有两种情况与原始类型的交互可能会导致出现未经检查的警告这一页 http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#110257:

  • 如果擦除更改了方法或构造函数的任何参数的任何类型,则调用原始类型的方法或构造函数会生成未经检查的警告。
  • 如果擦除更改了字段的类型,则对原始类型字段的赋值会生成未经检查的警告(第 5.1.9 节)。

所以你的问题的答案基本上似乎是“erasure http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#108979可能会导致在存在原始类型时出现未经检查的警告”。据我所知,当使用嵌套类型时最有可能发生这种情况 - 我在擦除定义中看不到任何其他可能会导致类型的地方改变,但也许其他人可以建议这是否是这个问题的根源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

原始类型、无界通配符和有界通配符 的相关文章

随机推荐