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

问题描述 投票:3回答:2

使用此代码:

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: ')' expectedInteger.getClass()的第一个括号中。

我对此处发生的事情感到困惑,因为我希望Eclipse显示编译器错误,和/或2.抛出错误,而不是出现正常执行和跳过代码行。

java eclipse lambda
2个回答
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);
    }
}

2
投票

是的,你是对的,根据Java Language Specification,Eclipse Java IDE应该在e instanceof Integer.getClass()上显示编译错误。

15.20.2. Type Comparison Operator instanceof

如果在instanceof运算符之后提到的ReferenceType不表示可重新生成的引用类型(§4.7),则这是编译时错误。

report this bug to Eclipse

© www.soinside.com 2019 - 2024. All rights reserved.