【问题标题】:Why is there no type conversion exception in this code?为什么这段代码没有类型转换异常?
【发布时间】:2016-01-16 02:42:00
【问题描述】:

这是来自Thinking in Java

class Snow {}
class Powder extends Snow {}
class Light extends Powder {}
class Heavy extends Powder {}
class Crusty extends Snow {}
class Slush extends Snow {}

public class AsListInference {
    public static void main(String[] args) {
        //The book says it won't compile, but actually it does.
        List<Snow> snow2 = Arrays.asList(new Light(), new Heavy());
    }
}

这是我的 Java 环境:

  1. java版本“1.8.0_60”
  2. Java(TM) SE 运行时环境(内部版本 1.8.0_60-b27)
  3. Java HotSpot(TM) 64 位服务器 VM(内部版本 25.60-b23,混合模式)

【问题讨论】:

  • 因为不应该有一个。 LightHeavy 是 Snow 的子类,因此可以添加到 ListSnow 中。
  • 在 Java 7 中,这段代码给了我一个编译错误 - Type mismatch: cannot convert from List&lt;Powder&gt; to List&lt;Snow&gt;

标签: java


【解决方案1】:

其实这本书是对的。这里的区别是Java版本。

Thinking in Java 以 Java 5/6 为目标(如封面所示)。对于这个版本的 Java(以及 Java 7),sn-p 不能用javac 编译。错误是:

不兼容的类型:java.util.List&lt;Powder&gt; 无法转换为java.util.List&lt;Snow&gt;

使用 Java 8,编译得很好:改进了类型推断系统。

【讨论】:

    【解决方案2】:

    这本书显然期望编译器将右侧的类型确定为List&lt;Powder&gt;,而不是List&lt;Snow&gt;。然而,由于Arrays.&lt;T&gt;asList(T ...)T 有自己的独立作用域,编译器能够推断出正确的界限应该是Snow,并且LightHeavy 都是Snow

    我手头没有 Java 7 编译器,但 Java 8 确实为 generic type inference 带来了一些改进,这可能是让编译器解决这种特定类型绑定的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多