所以,我正在浏览Oracle Java教程,特别是这段代码;Java泛型和instanceof关键字
List<EvenNumber> le = new ArrayList<>();
List<? extends NaturalNumber> ln = le;
ln.add(new NaturalNumber(35)); // compile-time error
哪能找到here。这是我的理解(并请纠正我,如果我错了),上述代码将无法正常工作,因为编译器不知道ln
引用一个EvenNumbers列表,所以这可以防止你意外添加任何可能是一个对象用于列表的元素的超类型。如果是这种情况,那么为什么如果你有像Number num = new Integer(6);
这样的语句,编译器能够正确地确定num是一个Integer对象,如果你这样写if语句的话; if (num instanceof Integer) {...}
?
我想我的问题是,如何能够确定num
指的是一个Integer
对象在第二个例子中,但无法确定ln
编译器指的是List<EvenNumber>
对象在第一个例子吗?
“为什么如果你有一个像Number num = new Integer(6)的语句;编译器能够正确地确定num是一个Integer对象” - 编译器不知道! 'instanceof'在运行时计算。 – user2357112
另请参阅我的[文章](http://bayou.io/draft/Capturing_Wildcards.html)通配符以防万一。 – ZhongYu