Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型和instanceof关键字_Java_Generics_Instanceof - Fatal编程技术网

Java泛型和instanceof关键字

Java泛型和instanceof关键字,java,generics,instanceof,Java,Generics,Instanceof,所以,我在浏览Oracle Java教程,特别是这段代码 List<EvenNumber> le = new ArrayList<>(); List<? extends NaturalNumber> ln = le; ln.add(new NaturalNumber(35)); // compile-time error List le=new ArrayList(); 列出你的两个例子是相反的 一个整数是一个数字,所以 List<Number>

所以,我在浏览Oracle Java教程,特别是这段代码

List<EvenNumber> le = new ArrayList<>();
List<? extends NaturalNumber> ln = le;
ln.add(new NaturalNumber(35));  // compile-time error
List le=new ArrayList();

列出你的两个例子是相反的

一个
整数
是一个
数字
,所以

List<Number> list;
list.add(new Integer(1)); // compiles
因为虽然
EvenNumber
NaturalNumber
,但
NaturalNumber
不一定是
EvenNumber

如果您在参考案例中交换
整数
数字
,然后对其进行返工,这应该是有意义的,即这将编译:

List<NaturalNumber> list;
list.add(new EvenNumber(2)); // compiles OK
列表;
列表。添加(新编号(2));//编译OK

无法编译的主要原因是
的方式?扩展T的行为。一般来说,人们应该熟悉PEC,简称PEC

现在,我没有看这个特定的代码示例,但是我想象层次结构是
EvenNumber
扩展
NaturalNumber
。这使得赋值语句有效,因为
偶数
自然数
(尽管我打赌数学家们对此嗤之以鼻)

在上面突出显示的场景中,无法向集合添加任何内容的原因主要是因为它主要用于从中读取。也就是说,列表是一个生产者,因此它与
扩展绑定

如果要对集合进行读写操作,只需去掉通配符即可


第二个示例与泛型无关,而是简单的继承。由于
整数
继承自
数字
,我们可以说
整数
是一个
数字
,因此可以被视为一个数字。任何继承的类都具有此功能。有关这方面的更多信息,请查看

一般来说,编译器能够确定许多事情,并在优化代码时使用其观察结果

然而,Java是类型化语言,编译器在类型安全方面没有自由

1) 禁止添加到
ln
列表,因为人们不知道它应该包含哪种类型的元素。在您的示例中,此规则阻止列表进入无效状态

2) “…编译器能够正确确定num是整数…”

不正确,编译器不能确定它(尽管如果Java是弱类型语言,它可以确定)

3)
num instanceof Integer

这是在运行时计算的,而不是在编译时。但是,以下情况会产生编译时错误:

num instanceof String


因为
数字
永远不能是
字符串

“为什么如果有一个像Number num=new Integer(6)这样的语句,编译器能够正确地确定num是一个整数对象”—编译器不知道
instanceof
是在运行时计算的。如果有帮助,请参阅my on wildcard。我想您描述的是一个场景,
List ln=le会出现,但事实并非如此。这会导致上面一行的编译错误,但在执行
add
@Makoto No时不会。我是说,他将整数添加到数字列表中的类比是不相关的,因为他在代码中有相反的类层次结构-就像Integer是Number的子类一样,EvenNumber是NaturalNumber的子类,但是他的代码试图将一个自然数添加到一个EvenNumber列表中,这就像试图将一个数字添加到一个整数列表中一样。。。这显然行不通,对不起。我是说“ln”而不是“le”。我编辑了我的帖子。我没有意识到instanceof是在运行时计算的。如何判断num是整数对象而不是数字对象?@BlaqICE每个Java对象都包含关于其类型的信息:。
List<NaturalNumber> list;
list.add(new EvenNumber(2)); // compiles OK