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

use*_*452 8 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);
}
Run Code Online (Sandbox Code Playgroud)

如果该方法更改为其通用形式,则程序将失败.

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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jor*_*nee 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);
}
Run Code Online (Sandbox Code Playgroud)


dav*_*xxx 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);
}
Run Code Online (Sandbox Code Playgroud)