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

时间:2010-08-16 00:54:38

标签: java generics bounded-wildcard

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

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)在分配给任何有界wilcard引用时,未经检查的警告都是问题(因为原始类型中的内容可能是任何内容)。

我的问题是因为c是最高上限(?扩展对象),不应该在没有该警告的情况下分配给c?

1 个答案:

答案 0 :(得分:1)

如果我正确地理解了你的问题(我真的不认为我这样做),根据this page,似乎有两个与原始类型的交互可能导致未经检查的警告发生的实例:< / p>

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

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