Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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
为什么';";数组instanceof Iterable“;用Java编译?_Java_Arrays_Compiler Errors - Fatal编程技术网

为什么';";数组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));