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-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(这里没有推断出确切的类型).接下来,执行简化过程,其考虑表达式兼容性约束将约束集减少到边界集.