在这本书中,它说:
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 {}
任何想法都表示赞赏。
答案 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的边界集。