Java:在匿名类中定义一个通用方法

8
以下 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);
}

为什么失败?如何在匿名类中定义通用方法?
这个问题是为了学习目的而提出的。

请发布精确的错误信息。 - Turing85
你为什么认为你想要做这件事? - Joe C
这是在Intellij中的错误:错误:(11,18)java:找不到符号 符号:方法setEnabled(boolean) 位置:类型为T的变量x。 - user7841452
一个好的第一步是将该方法复制到一个普通的命名类中,并确保它可以在那里编译。 - Jeffrey Bosboom
2个回答

11

T的擦除是Object,它没有setEnabled。如果你给它一个JComponent的边界,它就可以工作,因为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);
}

10

T 泛型并没有显式地从类或接口派生。因此它从 Object 派生,而 Object 没有 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接