Pregunta

¿Existe alguna forma abreviada de definir y usar definiciones genéricas sin tener que seguir repitiendo una descripción genérica particular, de modo que si hay un cambio no tenga que cambiar todas las definiciones/usos, aunque el código base, por ejemplo, es posible algo como esto:

Typedef myGenDef = < Object1, Object2 >;

HashMap< myGenDef > hm = new HashMap< myGenDef >();

for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}
¿Fue útil?

Solución

Ahí está el antipatrón pseudo-typedef...

class StringList extends ArrayList<String> { }

¡Qué bueno, bebe!;-)

Como señala el artículo, esta técnica tiene algunos problemas serios, principalmente que este "typedef" es en realidad una clase separada y, por lo tanto, no puede usarse indistintamente ni con el tipo que extiende ni con otros tipos definidos de manera similar.

Otros consejos

En un método genérico, puede utilizar una forma limitada de inferencia de tipos para evitar algunas repeticiones.

Ejemplo:si tienes la funcion

    <K, V> Map<K, V> getSomething() {
        //...
    }

puedes usar:

final Map<String, Object> something = getsomething();

en lugar de:

final Map<String, Object> something = this.<String, Object>getsomething();

Usar Patrón de fábrica para la creación de Genéricos:

Muestra de método:

public Map<String, Integer> createGenMap(){
        return new HashMap<String,Integer>();

    }

El antipatrón pseudo-typedef mencionado por Shog9 funcionaría, aunque no se recomienda utilizar un ANTIPATTERN, pero no responde a sus intenciones.El objetivo de pseudo-typedef es reducir el desorden en las declaraciones y mejorar la legibilidad.

Lo que se quiere es poder sustituir un grupo de declaraciones de genéricos por una única operación.Creo que hay que parar y pensar:"¿De alguna manera es valioso?".Quiero decir, no puedo pensar en un escenario en el que necesitarías esto.Imagina la clase A:

class A {
     private Map<String, Integer> values = new HashMap<String, Integer>();
}

Imagine ahora que quiero cambiar el campo 'valores' a un Mapa.¿Por qué existirían muchos otros campos dispersos en el código que necesitan el mismo cambio?En cuanto a las operaciones que utilizan 'valores', una simple refactorización sería suficiente.

No.Sin embargo, groovy, un lenguaje JVM, se escribe dinámicamente y te permitirá escribir:

def map = new HashMap<complicated generic expression>();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top