Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法显式引用非静态内部类实例?_Java_Android_Anonymous Inner Class - Fatal编程技术网

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

Java 有没有办法显式引用非静态内部类实例?,java,android,anonymous-inner-class,Java,Android,Anonymous Inner Class,您可以显式引用顶级类的类实例,如下所示: public class Dog { public void subscribeDogToTreats() { Set<?> listenerSet = map.get("treats"); listenerSet.add(Dog.this); map.put("treats", listenerSet); } } 在现实世界中,我想这样做的例子是将OnPageChangeListeners添加到viewpa

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

public class Dog {
  public void subscribeDogToTreats() {
    Set<?> listenerSet = map.get("treats");
    listenerSet.add(Dog.this);
    map.put("treats", listenerSet);
  }
}
在现实世界中,我想这样做的例子是将OnPageChangeListeners添加到viewpagers,并在Android中完成转换后将其删除。我知道关键字this引用了匿名内部类,但是当我遇到这样的情况时,我必须通过打印类名来证明这一点。我害怕有一个难以捕捉的bug,我引用的是外部类实例,我想引用的是内部类实例,反之亦然


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

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

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