Я пытаюсь создать набор перечислений, которые расширяют общий интерфейс, поэтому что-то вроде:
interface Fooable
{
void someCommonMethod();
}
enum E1 implements Fooable
{
// some enumuerations and a definition for someCommonMethod()
}
enum E2 implements Fooable
{
// some different enumerations and a different definition for someCommonMethod()
}
а затем использовать это в другом месте, устанавливая, что переменная является Enum и реализует интерфейс. Так что что-то вроде..
bar(Enum<? extends Fooable> fe)
{
fe.ordinal();
fe.someCommonMethod();
}
Однако до сих пор мне, кажется, приходилось приводить fe, чтобы рассматривать его как реализацию интерфейса, т. е.
bar(Enum<? extends Fooable> fe)
{
fe.ordinal();
((Fooable)fe).someCommonMethod();
}
и хотя это должно быть безопасно... это кажется неоптимальным, и я могу что-то упустить из виду. Конечно, если я попытаюсь просто передать параметр как Fooable, то я закончу кастингом, чтобы рассматривать его как Enum, и это не только не -усиление, теперь я даже не в безопасности. См. далее:
bar(Fooable fe)
{
// potentially unsafe cast!
((Enum<?>)fe).ordinal();
fe.someCommonMethod();
}
Есть ли что-то, что я упускаю из виду, или
Enum<? extends Fooable>
примерно так близко к «хорошему» решению, как я получу?
Я относительно новичок в Java и до сих пор ловлю себя на том, что пытаюсь использовать его как C или C++, поэтому, если я обращаюсь с ним как с молотком, а не с пилой, или упускаю из виду что-то глупо простое, не стесняйтесь указать на это:)