No estoy 100% convencido de que esta es una buena idea, pero me encontré con algo de código hoy que está implementado actualmente como:¿Cómo puedo exigir que un parámetro genérico sea una enumeración que implemente una interfaz?
class MyWidget <T extends Enum<T> > {
MyWidget(Map<T, Integer> valueMap) {
mValueMap = valueMap;
}
Map<T, Integer> mValueMap;
}
donde MyWidget
continuación, ofrece métodos que utilizan mValueMap
para convertir el pasado en Enum
a/desde un Integer
.
Lo que estaba pensando en hacer estaba tratando de refactorizar esto, así que me declaro mi enumeración:
interface MyInterface {
public Integer getValue();
}
enum MyEnum implements MyInterface {
foo, bar;
public Integer getValue() {
return ordinal();
}
}
Y entonces sería capaz de reescribir MyWidget
en algo que parecía vagamente como esto:
public class MyWidget<T extends Enum<T> extends MyInterface> {
...
}
y entonces sería capaz de llamar al método de getValue()
MyInterface
en T
de tipo objetos dentro MyWidget
. El problema, por supuesto, es que "<T extends Enum<T> extends MyInterface>
" no es una sintaxis válida. ¿Hay alguna manera de lograr esto?
No quiero simplemente tener MyWidget<T extends MyInterface>
, porque también es importante que T sea una enumeración.
¡Gracias de antemano!
La sintaxis & es nítida, pero me parece que usarla generalmente se convierte en un olor a código, y es una indicación de que algo no está bien con su modelo. – skaffman
Tiendo a estar de acuerdo (creo que lo he usado tal vez una o dos veces, si es eso). Pero en el caso de las enums que implementan una interfaz, creo que es apropiado. –
¡Excelente! Eso es exactamente lo que estaba buscando. Muchas gracias! – Sbodd