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

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

List a = new ArrayList(); List  b; List  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)在分配给任何有界威尔卡引用时,未经检查的警告都是问题(因为原始类型中的内容可以是任何东西)。

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

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

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

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