简体   繁体   English

如果匿名内部类有两个外部类,如何获取外部类的引用?

[英]How can I get the outer class's reference if the anonymous Inner Class has two outer class?

public class OuterClass {
    public class InnerClass{
         void test(){
         };
    }
}

class Client{
    public void x(){}
    public void lucian() {
        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass(){
            void test() {
                Client.this.x();
                x();
                ******** // how can I get the reference of the OuterClass at here? ********
            }
        };
        innerClass.test();
    }
}

I know the compiler will produce a constructor for the anonymous Inner Class with two arguments,one is the Client's refrence, another one is the OuterClass, but how can I get the OuterClass's refrence like Client's refrence in methoud test() using Client.this?我知道编译器将为带有两个参数的匿名内部类生成一个构造函数,一个是客户端的引用,另一个是外部类,但是如何使用 Client.this 在方法 test() 中获取外部类的引用,就像客户端的引用一样? Not the Client.this!!不是客户。这个!! But the OuterClass's refrence in Client.但是外部类在客户端中的引用。

You can't.你不能。 Not with crazy reflection shenanigans, anyway.无论如何,不​​是疯狂的反射恶作剧。 So, just write it out:所以,只要写出来:

public void lucian() {
    OuterClass oc = new OuterClass();
    OuterClass.InnerClass ic = oc.new InnerClass() {
        void test() {
            Client.this.x();
            x();
            oc.x();
        }
    };
    ic.test();
}

NB: Non-static inner classes are weird and rarely correct.注意:非静态内部类很奇怪,很少正确。 Beginner java coders should never use them;初学者 Java 程序员永远不要使用它们; advanced java coders should think long and hard.高级 Java 编码人员应该认真思考。 In any case, your default choice for inner classes should always be that they are static.在任何情况下,内部类的默认选择应该始终是它们是静态的。

You can save reference to the object of OuterClass (so far you create it anonymously):您可以保存对 OuterClass 对象的引用(到目前为止您是匿名创建的):

class Client{

    private OuterClass outerClass;

    public OuterClass getOuterClass() {
        return outerClass;
    }

    public void setOuterClass(OuterClass outerClass) {
        this.outerClass = outerClass;
    }

    public void x(){
        System.out.println("===");
    }
    public void lucian() {
        OuterClass outerClass = new OuterClass();
        setOuterClass(outerClass);
        OuterClass.InnerClass innerClass = outerClass.new InnerClass(){
            void test() {
                Client1.this.x();
                x();
                System.out.println(getOuterClass());
            }
        };
        innerClass.test();
    }
    public static void main(String[] args) {
        Client client = new Client();
        client.lucian();
    }

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM