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

时间:2016-03-10 07:20:05

标签: java inheritance type-inference

在这本书中,它说:

  

Arrays.asList()的限制是它需要最好的猜测   结果类型的列表,并不关注你   将它分配给。

本书是 Java in Thinking by 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 {}

Java 1.8,IntelliJ,Windows 7 enter image description here

任何想法都表示赞赏。

1 个答案:

答案 0 :(得分: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

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

在Java语言规范版本8中,有一个专用于类型推断的whole new chapter。它不是很容易阅读,但是根据我的理解,现在不是将具体类型分配给每个子表达式,而是分配一组constraints。在我们的例子中,约束是Light <: T && Heavy <: T(这里没有推断出确切的类型)。接下来执行简化过程,该约束过程将约束集减少到考虑expression compatibility constraints的边界集。