2011-02-10 13 views
5

Actualmente, tengo algo como esto: -Crear nombres de métodos genéricos en clase genérica?

public class MyHolder<T> { 
    private T value; 

    public MyHolder(T t) { 
     this.value = t; 
    } 

    public T getValue() { 
     return first; 
    } 

    public void setValue(T t) { 
     this.first = t; 
    } 
} 

Con esto, puedo utilizar de esta manera: -

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.getValue(); // returns bean 

lugar de llamar al captador/definidor ser getValue() y setValue(..), es Es posible "generar" eso también?

En esencia, sería bueno tenerlo getMyBean() y setMyBean(..), dependiendo del tipo se ha pasado. Concedió esto es un ejemplo muy sencillo, sin embargo, si se crea una clase de soporte genérico que toma N propiedades genéricas, entonces sería bueno llamarlo algo significativo en lugar de getValue1() o getValue2(), y así sucesivamente.

Gracias.

+1

No debe crear una clase de titular genérica que tenga N propiedades genéricas. Haga una clase real con un nombre útil y nombres de campo útiles. – ColinD

+1

Estoy seguro de que no se podría usar de la manera que le gustaría, incluso si fuera posible. – maaartinus

Respuesta

5

No. No existe tal característica en Java. Ni siquiera puedo imaginar cómo se vería sintácticamente ... void set<T>();? ¿Y cómo se vería el getter/setter por ejemplo MyHolder<? extends Number>?

1

No, no es posible a menos que utilice algún tipo de generador de código fuente para generar la clase MyHolder en función de su información.

Pero, por otro lado, incluso si tuviera esta posibilidad, ¿cómo sería diferente de usar un Map<String, T>? Entonces la invocación sería:

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.get('value'); 
1

No, no es posible. Los genéricos de Java se basan en el borrado de tipos, es decir, es principalmente azúcar sintáctica proporcionada por el compilador. Eso significa que cada clase genérica se implementa realmente mediante un "tipo sin procesar" donde los parámetros de tipo son Object y que ya contiene todos los métodos. Por lo tanto, no es posible tener diferentes métodos dependiendo de los parámetros de tipo.

+1

No diría que las borraduras tienen que ver con eso. Si hubiera una sintaxis para esto, el compilador podría derivar dichos nombres de método. Simplemente no es compatible. – aioobe

+1

No creo que el borrado lo impida, ya que podría ser una cosa completamente de tiempo de compilación que se reduce al nombre del método original para fines de tiempo de ejecución. No quiere decir que no haya muchos otros problemas con la idea. – ColinD

+1

Erasures tiene algo que ver con eso. Tendría un método 'getMyBean' en el código fuente y en el código compilado. Con 'getValue' no compilaría. Entonces tendrías que poner 'getMyBean' ahí, que está reificado y no borrado. – maaartinus

Cuestiones relacionadas