Как мне ссылаться на создаваемый объект? - PullRequest
0 голосов
/ 24 ноября 2018

В середине создания моего класса FXMLDocumentController мне нужно было использовать лямбда-выражение, которое создает новый объект с некоторыми @overrides, в котором @overrides мне нужно ссылаться на мой объект, как это сделать?

public class FXMLDocumentController implements Initializable {

    @Override
    public void initialize(URL url, ResourceBundle rb) {

        listViewArtigosMercado.setCellFactory((ListView<String> param) -> new ListCell<String>(){
            @Override
            public void updateItem(String name, boolean empty){
                super.updateItem(name,empty);
                if (name.equals("Vender")){
                    setText(name);
                    ((Node)this).setId("id");
                }
            }
        });
    }
}

Я хочу, чтобы мое ключевое слово this указывало на мою новую ListCell<String>, а не на FXMLDocumentController Как ссылаться на мой новый класс внутри реализации?

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Insted of (Node)this использовать Node.this.Вы можете получить текущий объект внешнего класса, вызвав OuterClass.this.

Затем вы можете просто вызвать его метод:

(OuterClass.this).methodOfOuterClass();
0 голосов
/ 24 ноября 2018

Здесь, как я вижу, вы используете функцию lambda внутри метода initialize, как показано ниже.

listViewArtigosMercado.setCellFactory((ListView<String> param) -> new ListCell<String>(){
      @Override
      public void updateItem(String name, boolean empty){
      super.updateItem(name,empty);
      if (name.equals("Vender")){
          setText(name);
              ((Node)this).setId("id");
          }
      }
 });

Lambda не рассматривается как анонимный класс.Таким образом, область действия лямбда-функции ограничена этим конкретным закрывающим закрытием.this - ссылка только для этой конкретной области.поэтому вы не можете писать this.setId('Id'); внутри лямбды setCelFactor, потому что она не содержит setId метода.

Здесь лямбда рассматривается как дочерний класс родительского класса.В вашем случае это дочерний класс FXMLDocumentController, поэтому он имеет доступ ко всем открытым методам родительского класса, так что вы можете использовать setID или другие методы напрямую без каких-либо ссылок.

0 голосов
/ 24 ноября 2018

Удалите приведение и this, это однозначный вызов, относящийся к методу родителя:

setId("id");

Внимательно посмотрите, как вы используете setText(name);.Этот метод взят из Labeled, но вы не использовали this и не приводили его к этому классу просто потому, что в этом не было необходимости.ListCell - это Labeled, а также Node.

...