使用此代码:
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Test{
public static void main(String[] args){
Integer[] numbers = {1, 2, 3, 4, 5};
List<Integer> list = new ArrayList<>(Arrays.asList(numbers));
list.stream().filter((e) -> e instanceof Integer.getClass()).collect(Collectors.toList());
// Never prints out
System.out.println(list);
}
}
filter语句调用Integer.getClass()
,它应显示编译器错误消息:Cannot make a static reference to the non-static method getClass() from the type Object
。 Eclipse没有显示任何错误,System.out.println(list)
永远不会运行。使用调试器(在Eclipse中)运行会显示list.stream()
行以及之后的所有行都被跳过。
此外,行import java.util.stream.Collectors
和List<Integer> list = ...
会突出显示为未使用。在Integer.getClass()
行上方添加list.stream()
行,只会在该行显示编译错误,其中包含Cannot make a static reference to the non-static method getClass() from the type Object
。
从命令行使用javac Test.java
编译java文件会在Test.java:10: error: ')' expected
的第一个括号中出现错误:Integer.getClass()
。
我对此处发生的事情感到困惑,因为我希望Eclipse显示编译器错误,和/或2.抛出错误,而不是出现正常执行并跳过代码行。
答案 0 :(得分:2)
这纯粹是Eclipse IDE本身的一个问题。我正在使用intellij的想法,我马上得到错误。见下面的截图:
无论如何,正确的代码应该是:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Test {
public static void main(String[] args) {
Integer[] numbers = {1, 2, 3, 4, 5};
List<Integer> list = new ArrayList<>(Arrays.asList(numbers));
list.stream()
.filter(e ->
e instanceof Integer
)
.collect(Collectors.toList());
// It now prints out :)
System.out.println(list);
}
}
答案 1 :(得分:2)
是的,你是对的,根据Java Language Specification, Eclipse Java IDE应该在e instanceof Integer.getClass()
显示编译错误。
15.20.2. Type Comparison Operator instanceof:
如果 ReferenceType 之后提到,则是编译时错误 instanceof运算符不表示可重新生成的引用类型 (§4.7)。