2

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

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 吗?

4

1 回答 1

1

如果我正确理解了您的问题(而且我真的不认为我这样做),那么根据此页面,似乎有两种情况下与原始类型的交互可能会导致出现未经检查的警告:

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

因此,您的问题的答案基本上似乎是“在存在原始类型的情况下,擦除可能会导致未经检查的警告”。据我所知,这最有可能在使用嵌套类型时发生 - 我在擦除定义中看不到可能导致类型更改的其他任何地方,但也许其他人可以建议是否是或不是这个的来源。

于 2010-08-16T01:15:15.010 回答