Java 为什么这段代码中没有类型转换异常?

Java 为什么这段代码中没有类型转换异常?,java,Java,这是用Java思考的结果 classsnow{} 类{} 类灯光{} 类{} 类Crusty扩展Snow{} 类Slush扩展了Snow{} 公共类ASLIST推理{ 公共静态void main(字符串[]args){ //这本书说它不会编译,但事实上它编译了。 List snow2=Arrays.asList(new Light(),new Heavy()); } } 以下是我的Java环境: java版本“1.8.0_60” Java(TM)SE运行时环境(build 1.8.0_60-b

这是用Java思考的结果

classsnow{}
类{}
类灯光{}
类{}
类Crusty扩展Snow{}
类Slush扩展了Snow{}
公共类ASLIST推理{
公共静态void main(字符串[]args){
//这本书说它不会编译,但事实上它编译了。
List snow2=Arrays.asList(new Light(),new Heavy());
}
}
以下是我的Java环境:

  • java版本“1.8.0_60”
  • Java(TM)SE运行时环境(build 1.8.0_60-b27)
  • Java HotSpot(TM)64位服务器虚拟机(构建25.60-b23,混合模式)

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


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

    实际上,这本书是对的。这里的区别是Java版本

    针对Java 5/6(根据封面)。对于这个版本的Java(以及Java 7),代码片段将不会用
    javac
    编译。错误是:

    不兼容的类型:
    java.util.List
    无法转换为
    java.util.List


    使用Java8,编译效果很好:类型推断系统得到了改进。

    因为不应该有类型推断系统
    Light
    Heavy
    是Snow的子类,因此可以添加到
    Snow
    列表中。在Java 7中,此代码给了我一个编译错误-
    类型不匹配:无法从列表转换到列表
    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());
        }
    }