从内部匿名类访问外部匿名类

2022-09-02 21:52:06

我只是好奇。有没有办法访问另一个匿名类中的匿名类中的父级?

我让这个例子创建一个子类(匿名类)覆盖,并在里面创建另一个匿名类。JTablechangeSelection

MCVE:

public class Test{

    public static void main(String args []){

        JTable table = new JTable(){

            @Override
            public void changeSelection(
                final int row, final int column,
                final boolean toggle, final boolean extend) {

                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        super.changeSelection(row, column, toggle, extend); 
                        //more code here
                    }
                });
            }
        };

    }//end main

}//end test 

我该如何参考?super.changeSelection(..)


答案 1

不幸的是,您必须为外部匿名类命名:

public class Test{

    public static void main(String args []){

        class Foo extends JTable {

            @Override
            public void changeSelection(
                final int row, final int column,
                final boolean toggle, final boolean extend) {

                SwingUtilities.invokeLater(new Runnable() {
                    @Override
                    public void run() {
                        Foo.super.changeSelection(row, column, toggle, extend); 
                        //more code here
                    }
                });
            }
        };

        JTable table = new Foo();

    }//end main

}//end test 

答案 2

在你的上下文中,“超级”当然是指可运行的基础,而不是JTable基础。如您所知,在内部类中使用“super”是指该内部类的超类,而不是其封闭类的超类(它是否匿名并不重要)。由于您要调用 JTable 基的方法,因此必须在其中一个 JTable 子类方法的上下文中使用“super”。

您可以在JTable子类中创建一个新方法,例如jTableBaseChangeSelection(),它调用您打算调用的JTable的changeSelection()。然后,从 Runnable 子类调用它:

public static void main(String args []){

    JTable table = new JTable(){

        // calls JTable's changeSelection, for use by the Runnable inner
        // class below, which needs access to the base JTable method.
        private void jTableBaseChangeSelection (int row, int column, boolean toggle, boolean extend) {
            super.changeSelection(row, column, toggle, extend);
        }

        @Override
        public void changeSelection(
            final int row, final int column,
            final boolean toggle, final boolean extend) {

            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    // call JTable base changeSelection, since we don't have access
                    // to the JTable base class at this point.
                    jTableBaseChangeSelection(row, column, toggle, extend); 
                    //more code here
                }
            });
        }
    };

}//end main

请注意,这个答案试图保留你原来的匿名封闭类设计。这样做当然是有原因的(是的,在某些情况下,快速整理一些代码一个有效的理由)。有一些孤立的情况发生这种情况 - 没有造成伤害;但是,如果您发现自己经常陷入这种情况,您可能仍然希望重新考虑您的设计。


推荐