Io non sono convinto al 100% che si tratta di una buona idea, ma mi sono imbattuto in un certo codice di oggi che è attualmente implementato come:Come posso richiedere che un parametro generico sia un enum che implementa un'interfaccia?
class MyWidget <T extends Enum<T> > {
MyWidget(Map<T, Integer> valueMap) {
mValueMap = valueMap;
}
Map<T, Integer> mValueMap;
}
dove MyWidget
poi offre metodi che usano mValueMap
per convertire il passato-in Enum
a/da un Integer
.
Quello che mi stava prendendo in considerazione facendo stava cercando di refactoring questo, in modo che avrei dichiaro la mia enumerazione:
interface MyInterface {
public Integer getValue();
}
enum MyEnum implements MyInterface {
foo, bar;
public Integer getValue() {
return ordinal();
}
}
e sarei quindi in grado di riscrivere MyWidget
in qualcosa che sembrava vagamente simile a questo:
public class MyWidget<T extends Enum<T> extends MyInterface> {
...
}
e sarebbe quindi in grado di chiamare il metodo getValue()
da MyInterface
su T
tipo oggetti all'interno MyWidget
. Il problema, ovviamente, è che "<T extends Enum<T> extends MyInterface>
" non è una sintassi valida. C'è un modo per farcela?
Non voglio avere solo MyWidget<T extends MyInterface>
, perché è anche importante che T sia un'enumerazione.
Grazie in anticipo!
Il & sintassi è pulito, ma trovo che usarlo di solito si trasforma in un odore di codice, ed è un'indicazione che qualcosa non è proprio giusto con il tuo modello. – skaffman
Sono tendenzialmente d'accordo (penso di averlo usato forse una o due volte, se così fosse). Ma nel caso di enumerazioni che implementano un'interfaccia, penso che sia appropriato. –
Eccellente! Questo è esattamente quello che stavo cercando. Grazie mille! – Sbodd