为什么';";数组instanceof Iterable“;用Java编译?
这段代码编译并运行。输出为:为什么';";数组instanceof Iterable“;用Java编译?,java,arrays,compiler-errors,Java,Arrays,Compiler Errors,这段代码编译并运行。输出为: Object[] array = new Object[]{}; System.out.println((array instanceof Serializable));//passed System.out.println((array instanceof Cloneable));//passed 但是,此代码不编译: true true Eclipse编译器报告: 不兼容的条件操作数类型Object[]和Iterable 我发现当使用操作instanceo
Object[] array = new Object[]{};
System.out.println((array instanceof Serializable));//passed
System.out.println((array instanceof Cloneable));//passed
但是,此代码不编译:
true
true
Eclipse编译器报告:
不兼容的条件操作数类型Object[]和Iterable
我发现当使用操作
instanceof
时,数组只能在接口可序列化
和可克隆
之间进行比较。有人能告诉我为什么吗?您混淆了对象是否适合在foreach循环中使用,以及数组没有实现的Iterable
接口
foreach语法支持数组和Iterable
这并不意味着数组是可写的。我想这是因为
可序列化的和可克隆的都是标记接口,而as可写的不是。根据§(类型比较运算符instanceof
):
如果RelationalExpression对ReferenceType的强制转换将作为
编译时错误,则关系表达式的实例也会生成
编译时错误。在这种情况下,instanceof
表达式的结果
不可能是真的
和§(演员表)规定:
如果操作数的编译时类型可能永远不会更改,则为编译时错误
根据铸造规则铸造到铸造操作员指定的类型
转换(§)
最后,§(参考型铸造)说明:
给定编译时引用类型S(源)和编译时引用类型
T(目标),如果没有发生编译时错误,则存在从S到T的强制转换
由于以下规则
[……]
如果S是SC[]类型的数组,即SC类型的组件数组:
- 如果T是接口类型,则除非T是接口类型,否则会发生编译时错误
java.io.Serializable
或类型Cloneable
(实现的唯一接口
通过数组)
因此,Java要求测试数组类型是否是Java.lang.Iterable
的实例会导致编译时错误
如果仍要尝试使其工作(始终返回false
),可以先将数组强制转换为对象,如下所示:
System.out.println((array instanceof Iterable));//not passed
因为java是一种静态语言,所以编译器知道数组在编译时不可Iterable
,编译器知道Iterable的array instanceof
永远不可能为真,所以它会触发编译时错误来警告您。@GregKopff这是标题中提出的问题。不,问题不在于数组为什么不可iterable;这就是为什么编译器认为该行不是有效的Java。在使用操作“instanceof”时,它对左操作数和右操作数之间的关系是否有一些限制,我发现“123”instanceof Iterable将不会传递,如果我将“123”强制转换为对象引用,它将被传递!这是一个对象现在或将来是否可能匹配该接口的问题。“123”实际上是一个最终值,因此在某些情况下,当对象可能位于某个位置时,它永远不可能是可移植的@Ohyahchenzai:或者Java编译器“真的很智能”。您可以强制转换为对象,但每次都会以“false”结束,因为数组类没有实现Iterable。增强的for语句中对数组有特殊的支持,就像对iterable一样。由于数组类型与Iterable的赋值不兼容,因此会出现编译错误,就像试图将字符串转换为数字一样。
System.out.println((((Object)array) instanceof Iterable));