2014-04-10 4 views
3

Я рассматриваю образец образца лямбда и javaFX «MaryHadALittleLambda» (https://github.com/steveonjava/MaryHadALittleLambda).ObservableList <Node> метод ошибка ссылки в Eclipse

Все отлично компилируется, кроме метода

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); 
} 

как я получаю сообщение об ошибке в Eclipse, на Foreach линии,

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

в цикле, принимает эталонный метод для метода экземпляра из клеток Объект, который отлично выглядит для меня. Если я использую следующую лямбду вместо этого, он отлично работает:

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

Таким образом, кажется, что каждый особенность Явы 1.8 составляет безопасна для этой ссылки JavaFX. Я предполагаю, что что-то не так с моей версией или настройкой Java? Я использую:

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

И используя JRE от этой версии Java (выход из командной строки):

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) 

Спасибо.

+0

Я попробовал проект MaryHadALittleLambda в IntelliJ Idea IU-135,667 (13.1.2) с Java 8b132 (релиз производства). Идея также отмечает ссылку 'cells.getChildren() :: add' как ошибку в редакторе, но Idea все равно будет компилировать и исполнять исходный текст без ошибок. Я не могу объяснить вам, почему это так. – jewelsea

ответ

1

Я отвечу на свой вопрос, предоставив некоторые обновления: Я связался с автором, который предложил попробовать java-компилятор, а не затмение: создание с помощью Ant (и, следовательно, с использованием jdk javac-компилятора) компилируется просто отлично, а запускается приложение.

Когда я смотрел на статус поддержки Java 8 в затмение, кажется, есть много вещей, которые необходимо решить: https://bugs.eclipse.org/bugs/buglist.cgi?quicksearch=1.8%20lambda

Как @jewelsea отметил, Intellij идея показывает ошибки, но будет компилировать и выполнять (я предполагаю, он использует javq-предоставленный javac).

Так ответ: ждут предстоящих обновлений для затмения и/или jdk. Этот конкретный случай легко работать.

И реальная проблема в том, что mapToObj обеспечивает Stream<Object>, и цикл будет проходить Object к ::add который ожидает Node экземпляров (как Rectangle есть).

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); 
} 
+0

Действительно, вы правы, это тоже работает. IntFunction > предоставляет тип, который компилятор Eclipse не может вывести, как вы предложили. – lazi74

Смежные вопросы