Java中的C ++模板?

我想要这样的东西:
public abstract class ListenerEx<LISTENER, PARENT> implements LISTENER {
    PARENT parent;
    public ListenerEx(PARENT p) {
        parent = p;
    }
}
但它没有编译。有更好的解决方案吗? 像C ++模板这样的Java有什么东西可以在模板扣除后检查语法吗? 以下解释了为什么我需要这样一个ListenerEX类, 如果你已经知道它是什么,你不需要阅读以下内容。 我有一个主窗口,上面有一个按钮,我希望能够访问监听器中主窗口的某些方法:
public class MainWindow extends JFrame {
    public void doSomething() {
        /* ... */
    }
    public void doSomethingElse() {
        /* ... */
    }

    private JButton button;

    public MainWindow() {
        button = new JButton(...);
        add(button);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                doSomething();
                doSomethingElse();
            }
        });
    }
}
这会编译但不能始终正常工作。 (当ActionListener没有doSomething()方法时,为什么会编译?) 我们当然可以这样做:
public class MainWindow extends JFrame {
    public void doSomething() {
    }
    public void doSomethingElse() {
    }

    private JButton button;

    public MainWindow() {
        button = new JButton(...);
        add(button);

        class ActionListener1 implements ActionListener {
            MainWindow parent;
            public ActionListener(MainWindow p) {
                parent = p;
            }
            public void actionPerformed(ActionEvent e) {
                parent.doSomething();
                parent.doSomethingElse();
            }
        }
        button.addActionListener(new ActionListener1(this));
    }
}
不过我讨厌这种风格...... 所以我尝试过:
public abstract class ActionListenerEx<P> implements ActionListener {
    P parent;
    public ActionListenerEx(P p) {
        parent = p;
    }
}
public class MainWindow extends JFrame {
    public void doSomething() {
    }
    public void doSomethingElse() {
    }

    private JButton button;

    public MainWindow() {
        button = new JButton(...);
        add(button);
        button.addActionListener(new ActionListenerEx<MainWindow>(this) {
            public void actionPerformed(ActionEvent e) {
                parent.doSomething();
                parent.doSomethingElse();
            }
        });
    }
}
但ActionListener旁边有很多听众......
public abstract class ActionListenerEx<LISTENER, PARENT> implements LISTENER {
    PARENT parent;
    public ActionListenerEx(PARENT p) {
        parent = p;
    }
}
但是,它不会编译...... 我对Java很新鲜,我想知道是否有更好的解决方案。     
已邀请:
  为什么会在编译时编译   ActionListener没有   doSomething()方法?) 因为包含类具有doSomething()方法。那里有一个隐含的
MainWindow.this
。 你的第一个版本出了什么问题?看起来很好。除此之外,你的问题是什么?你到处都是,发布了一堆代码。     
  Blockquote我想要这样的东西:
public abstract class ListenerEx<LISTENER, PARENT> implements LISTENER {
PARENT parent;
public ListenerEx(PARENT p) {
    parent = p;
}
} 但它没有编译。有更好的解决方案吗?像C ++模板这样的Java有什么东西可以在模板扣除后检查语法吗? 它不能编译,因为你不能用硬编码的类/接口进行参数化。 所以,
ListenerEx<LISTENER, PARENT>
毫无意义。你想要的是什么
ListenerEx<L extends LISTENER, P extends PARENT>
呃...所以不习惯在stackoverflow上发帖     
法尔马里是对的。使用ActionListener的Annonymous Inner Class定义的初始代码版本很好。如果您的代码无法正常工作,则错误不是来自那里。 我注意到你在MainWindow的构造函数中有ActionListener。确保在ActionListener中调用doSomething ...()方法之前初始化实例变量。 我想给你的另一个极端谨慎的词是你使用MainWindow和JFrame之间的泛化关系(父子关系)。请记住,如果你扩展JFrame,你继承了JFrame中定义的所有方法。在许多情况下(特别是涉及gui的)人们使用泛化关系,实际上,他们想要一种构成关系。最好有一个指向JFrame的实例变量,而不是让它成为JFrame的子类。 长话短说,检查你是否可以编写你的代码,而不是让MainWindow成为JFrame的孩子。如果你可以,你不应该让MainWindow成为JFrame的孩子。     

要回复问题请先登录注册