El siguiente código Java funciona bien.
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); }Si el método se cambia a su forma genérica, el programa falla.
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); }¿Por qué falla? ¿Cómo se pueden definir métodos genéricos dentro de una clase anónima?
Esta pregunta es para fines de aprendizaje.
El borrado de T es Object , que no tiene setEnabled . Funciona si le das un límite de JComponent , que define 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); }El genérico T no se deriva explícitamente de una clase o una interfaz. Por lo tanto, se deriva de Object y Object no tiene el método setEnabled() .
Si desea usar genérico, puede especificar un tipo base java.swing que tenga este método. Por ejemplo: 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); }