以下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);
}
为什么会失败?如何在匿名类中定义泛型方法?
这个问题是出于学习目的。
答案 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
泛型不是从类或接口明确派生的。因此它来自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);
}