Java从内部匿名类访问外部匿名类的方法

我用一个实例化另一个匿名类的方法实例化一个匿名类,并且从这个内部匿名类我想调用一个属于外部匿名类的方法。 为了说明它,假设我有如下接口:

interface ReturnsANumber {
    int getIt();
}

然后,在我的代码中的某个地方,我这样做:

ReturnsANumber v = new ReturnsANumber() {
            int theNumber() {
                return 119;
            }

            public int getIt() {

                // In a modern version of Java, maybe I could do
                //   var a = this;
                // and then call a.theNumber();

                ReturnsANumber w = new ReturnsANumber() {
                        int theNumber() {
                            return 1;
                        }

                        public int getIt() {
                            return this.theNumber();
                        }
                    };

                return w.getIt();
            }
        };
    System.out.println("The number is " + v.getIt());

问题:在最里面的方法getIt中,我想调用属于最外层匿名类的Number()。 如何在不使用Java 10 var功能的情况下完成(如代码中所示)。

说明:理想情况下,外部匿名类不应该知道内部类想要调用它的theNumber方法。 我们的想法是提出一些代码,让内部类明确地调用外部类的任何方法。

换句话说,如何显示此代码:数字为119(而不是显示数字为1)

目的:有人可能会问我为什么要这样做:我正在编写某种代码生成器,并希望确保我生成的代码不含糊。

 
java
methods
java-8
anonymous-class
method-reference
3s

推荐解答

从Java 8开始,解决方案非常简单。 只需将方法引用存储在变量中。

ReturnsANumber v = new ReturnsANumber() {
        int theNumber() {
            return 119;
        }

        public int getIt() {

            Supplier<Integer> supplier = this::theNumber;

            ReturnsANumber w = new ReturnsANumber() {
                int theNumber() {
                    return 1;
                }

                public int getIt() {
                    return supplier.get();
                }
            };

            return w.getIt();
        }
    };

存储外部对象也可以解决问题。 但仅限于继承方法:

interface ReturnsANumber {
    int theNumber();
    int getIt();
}

public int getIt() {
    ReturnsANumber outer = this;

    ReturnsANumber w = new ReturnsANumber() {
        public int theNumber() {
            return 1;
        }

        public int getIt() {
            return  outer.theNumber();
        }
     };

     return w.getIt();
 }

您也可以将方法引用或外部对象存储为字段。

更新

您可以将外部对象传递给lambda:

ReturnsANumber v = new ReturnsANumber() {
    ...
    @Override
    public int getIt() {
        ReturnsANumber w = Optional.of(this).map(outer ->
                new ReturnsANumber() {
                    int theNumber() {
                        return 1;
                    }
                    public int getIt() {
                        return outer.theNumber();
                    }
                }).get();
        return w.getIt();
    }
};


  nopapp推荐


其它解答 (2)

java匿名内部类访问外部对象 - harryper - 博客园
java匿名内部类访问外部对象-harryper-博客园harryper博客园首页新随笔联系订阅管理随笔-3文章-0评论-0java匿名内部类访问外部对象问题:  在《Java编程思想》关于内部类的介绍中有这样一句话:如果定义一个匿名内部类,并且希望它使用一个在外部定义的对象,那么编译器器会要求其参数引用是final的。interfaceDestination{StringreadLabel();}publicclassParcel{publicDestinationdestination(finalStringdest){returnnewDestination(){priva
  cnblogs.com
匿名内部类及如何访问外部变量 - 格色情调的博客 - CSDN博客
匿名内部类及如何访问外部变量-格色情调的博客-CSDN博客原匿名内部类及如何访问外部变量2017年03月08日16:50:48格色情调1984阅读数:1695标签:匿名类final个人分类:Java基础版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/liuhaiabc/article/details/60873699一、java中匿名内部类1、匿名内部类也就是没有名字的内部类2、正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写3、但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口二、实现抽象方法不使用匿名内部类与使用
  csdn.net