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)
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |