Java:在匿名类中定义泛型方法

时间:2017-04-09 18:39:58

标签: java anonymous-class generic-method

以下java代码可以正常工作。

public static void main(String[] arg){
    JPanel p = (new JPanel());
    p.add( new Object(){
        JButton f(JButton x){
            x.setEnabled(false);
            return x;
        }}.f(new JButton("B")) );
    JFrame w = new JFrame("W");
    w.add(p);
    w.pack();
    w.setVisible(true);
}

如果方法更改为通用格式,程序将失败。

public static void main(String[] arg){
    JPanel p = (new JPanel());
    p.add( new Object(){
        <T> T f(T x){
            x.setEnabled(false);
            return x;
        }}.f(new JButton("B")) );
    JFrame w = new JFrame("W");
    w.add(p);
    w.pack();
    w.setVisible(true);
}

为什么会失败?如何在匿名类中定义泛型方法?

这个问题是出于学习目的。

2 个答案:

答案 0 :(得分:11)

T的删除是Object,其中没有setEnabled。如果你给它JComponent的边界定义setEnabled

,它就有效
public static void main(String[] arg) {
    JPanel p = (new JPanel());
    p.add( new Object(){
        <T extends JComponent> T f(T x){
            x.setEnabled(false);
            return x;
        }}.f(new JButton("B")) );
    JFrame w = new JFrame("W");
    w.add(p);
    w.pack();
    w.setVisible(true);
}

答案 1 :(得分:10)

T泛型不是从类或接口明确派生的。因此它来自ObjectObject没有setEnabled()方法。

如果要使用泛型,可以指定具有此方法的java.swing基类型。例如:javax.swing.AbstractButton

public static void main(String[] arg){
    JPanel p = (new JPanel());
    p.add( new Object(){
        <T extends AbstractButton> T f(T x){
            x.setEnabled(false);
            return x;
        }}.f(new JButton("B")) );
    JFrame w = new JFrame("W");
    w.add(p);
    w.pack();
    w.setVisible(true);
}