Eclipse中的ObservableList <node>方法引用错误</node>

时间:2014-04-10 21:46:18

标签: java eclipse lambda java-8

我正在查看lambda和javaFX示例项目“MaryHadALittleLambda”(https://github.com/steveonjava/MaryHadALittleLambda)。

除了方法

之外,所有内容都编译得很好
private void populateCells(Group root, final SpriteView.Mary mary) {
    // Gratuitous use of lambdas to do nested iteration!
    Group cells = new Group();
    IntStream.range(0, HORIZONTAL_CELLS).mapToObj(i ->
            Rectangle rect = new Rectangle(i * CELL_SIZE, j * CELL_SIZE, CELL_SIZE, CELL_SIZE);
            rect.setFill(Color.rgb(0, 0, 0, 0));
            rect.setStrokeType(StrokeType.INSIDE);
            rect.setStroke(Color.BLACK);
            rect.setOnMousePressed(e -> mary.moveTo(new Location(i, j)));
            return rect;
        })
    ).flatMap(s -> s).forEach(cells.getChildren()::add);  // <-- ERROR HERE

    root.getChildren().add(cells);
}

因为我在forEach行上的Eclipse中出现错误,

The type ObservableList<Node> does not define add(Object) that is applicable here   

forEach采用方法引用 cells 对象的实例方法,这对我来说非常有效。如果我使用以下lambda,它可以正常工作:

    ).flatMap(s -> s).forEach(r -> cells.getChildren().add((Rectangle) r)); 

因此,似乎java 1.8的每个功能都在为这个javaFx引用编译安全。 我的猜测是我的版本或Java设置有问题?我正在使用:

Eclipse Standard/SDK version: Kepler Service Release 2
Eclipse Java Development Tools Patch with Java 8 support (for Kepler SR2)

使用此Java版本的JRE(从命令行输出):

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

感谢。

2 个答案:

答案 0 :(得分:1)

我将通过提供一些更新来回答我自己的问题: 我联系了建议我尝试java编译器的作者,而不是eclipse&#s;使用Ant构建(因此使用jdk javac编译器)编译得很好,应用程序运行。

当我在eclipse中查看java 8支持的状态时,似乎有很多事情需要解决:https://bugs.eclipse.org/bugs/buglist.cgi?quicksearch=1.8%20lambda

正如@jewelsea指出的那样,Intellij Idea会显示错误,但会编译并执行(我假设它使用了jdk提供的javac)。

所以答案是:等待eclipse和/或jdk即将发布的更新。这个特殊情况很容易解决。

真正的问题是mapToObj提供Stream<Object>,循环会将Object传递给期望::add个实例的Node(作为{ {1}}是。

答案 1 :(得分:0)

我遇到了同样的问题。这必须是Eclipse编译器中类型推断的某种错误。我发现在mapToObj中手动提取函数时它也会编译:

private void populateCells(Group root, final SpriteView.Mary mary) {
    IntFunction<Stream<Rectangle>> mapper = i -> IntStream.range(0,
            VERTICAL_CELLS)
            .mapToObj(
                    j -> {
                        Rectangle rect = new Rectangle(i * CELL_SIZE, j
                                * CELL_SIZE, CELL_SIZE, CELL_SIZE);
                        rect.setFill(Color.rgb(0, 0, 0, 0));
                        rect.setStrokeType(StrokeType.INSIDE);
                        rect.setStroke(Color.BLACK);
                        rect.setOnMousePressed(e -> mary
                                .moveTo(new Location(i, j)));
                        return rect;
                    });
    // Gratuitous use of lambdas to do nested iteration!
    Group cells = new Group();
    IntStream.range(0, HORIZONTAL_CELLS).mapToObj(mapper).flatMap(s -> s)
            .forEach(cells.getChildren()::add);

    root.getChildren().add(cells);
}