如何引用正在创建的对象?

时间:2018-11-24 14:59:45

标签: java inheritance javafx this anonymous-class

在构建FXMLDocumentController类的中间,我需要使用一个lambda表达式来创建一个带有@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 :(得分:3)

删除强制类型转换和this,这是引用父级方法的明确调用:

setId("id");

仔细查看您如何使用setText(name);。该方法来自Labeled,但是您既没有使用this也没有将其强制转换为该类,这仅仅是因为不需要这样做。 ListCellLabeled也是Node

答案 1 :(得分:0)

在这里,正如我所看到的,您在如下的initialize方法中使用lambda函数。

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不会被视为匿名类。因此,lambda函数的范围仅限于特定的封闭对象。 this仅用于该特定作用域的引用。因此您不能在setCelFactor lambda中写入this.setId('Id');,因为它不包含setId方法。

在这里,lambda被视为父类的子类。在您的情况下,其子类为FXMLDocumentController,因此它具有父类的所有公共方法的可访问性,因此您可以直接使用setID或其他没有任何引用的方法。

答案 2 :(得分:-1)

(Node)this中使用Node.this。您可以通过调用OuterClass.this来获取外部类的当前对象。

然后您可以调用它的方法:

(OuterClass.this).methodOfOuterClass();