在Java第4版的Thinking中,Arrays.asList()的限制不正确

Xuz*_*ang 8 java inheritance type-inference

在这本书中,它说:

Arrays.asList()的一个限制是它对List的结果类型进行了最佳猜测,并没有注意你将它分配给它的内容.

这本书是由Java思考作者:Bruce Eckel

但是,以下代码工作正常,与本书第280页中显示的代码相反

public class Main{

    public static void main(String[] args) {
        List<Snow> snow = Arrays.asList(new Light(), new Heavy());
    }
}
class Snow {}
class Powder extends Snow {}
class Light extends Powder {}
class Heavy extends Powder {}
Run Code Online (Sandbox Code Playgroud)

Java 1.8,IntelliJ,Windows 7 在此输入图像描述

任何想法都表示赞赏.

Tag*_*eev 8

此代码在Java-7中失败,但在Java-8中编译.使用javac 7u80我看到:

Main.java:7: error: incompatible types
                List<Snow> snow = Arrays.asList(new Light(), new Heavy());
                                               ^
  required: List<Snow>
  found:    List<Powder>
1 error
Run Code Online (Sandbox Code Playgroud)

Java-8中的类型推断得到了显着改善.在此之前,仅根据对该子表达式的分析推断出每个子表达式的类型,因此Arrays.asList(new Light(), new Heavy())无论周围环境如何,都需要知道其类型.在Java-8中,周围的上下文可能会考虑表达式类型.

在Java语言规范版本8中,有一个专门讨论类型推断的全新章节.它不是很容易阅读,但我现在的理解是,不是为每个子表达式分配具体类型,而是分配一组约束.在我们的例子中,约束是Light <: T && Heavy <: T(这里没有推断出确切的类型).接下来,执行简化过程,其考虑表达式兼容性约束将约束集减少到边界集.