[英]Java defining generic class as parameter for static method, to pass entity objects
[英]Java: Defining a generic method inside an anonymous class
以下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
generic不是從類或接口明確派生的。 所以它派生自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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.