是否应该允许java中的lambda调用不存在的方法?

时间:2018-03-05 05:43:35

标签: java eclipse lambda

使用此代码:

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.CollectorsList<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.抛出错误,而不是出现正常执行并跳过代码行。

2 个答案:

答案 0 :(得分:2)

这纯粹是Eclipse IDE本身的一个问题。我正在使用intellij的想法,我马上得到错误。见下面的截图:

enter image description here

无论如何,正确的代码应该是:

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)。

report this bug to Eclipse