Я пытаюсь создать набор перечислений, расширяющих общий интерфейс, например:
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++, поэтому, если я отношусь к нему как к молотку, а не к пиле, или упускаю из виду что-то глупо простое, не стесняйтесь указывать на это :)