有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有办法显式引用非静态内部类实例吗?

可以显式引用顶级类的类实例,如下所示:

public class Dog {
  public void subscribeDogToTreats() {
    Set<?> listenerSet = map.get("treats");
    listenerSet.add(Dog.this);
    map.put("treats", listenerSet);
  }
}

但是,如果您试图从匿名内部类中引用它,目的是引用匿名内部类。使用相同的命名模式,您将收到错误“不是封闭类”例如:

public class Dog {
  void initializeHunger() {
    OnHungerChangeListener listener = new OnHungerChangeListener() {
      public void onHungerChanged(int stomachCapacity) {
       if(stomachCapacity == Stomach.FULL) {
         stomach.removeOnHungerChangeListener(OnHungerChangeListener.this);
       }
     }
   }
   stomach.addOnHunderChangeListener(listener);

在现实世界中,我想这样做的例子是将OnPageChangeListeners添加到viewpagers,并在Android中完成转换后将其删除。我知道关键字this引用了匿名内部类,但是当我遇到这样的情况时,我必须通过打印类名来证明这一点。我害怕有一个难以捕捉的bug,我引用的是外部类实例,我想引用的是内部类实例,反之亦然

我更喜欢用狗。这个或内部类。这是显式的,我想知道是否有一种方法可以为非静态内部类实现这一点,或者其他开发人员如何处理这一点(在Android Studio中,这两个引用的颜色编码相同)。除了记住这总是指作用域中最内部的类实例之外,还有什么方法可以使其显式化吗


共 (1) 个答案

  1. # 1 楼答案

    您描述的是根据Java语言规范必须做的事情。在Java中,没有办法改变this的含义,也没有办法改变封闭类的限定条件,如果您正试图这样做的话。如果这对你有帮助的话,你可以随时制作自己的局部变量作为快捷方式