以下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);
}
为什么会失败?如何在匿名类中定义泛型方法?
这个问题是出于学习目的。
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);
}
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);
}