Я параметризированный интерфейс:Как дженерики управляются перечислениями?
public interface MyInterface<T> {
void run(T e);
}
И классы, реализующие интерфейс:
public class MyClass1 implements MyInterface<SomeOtherClass1> {
public void run(SomeOtherClass1 e) {
// do some stuff with e
}
}
public class MyClass2 implements MyInterface<SomeOtherClass2> {
public void run(SomeOtherClass2 e) {
// do some stuff with e
}
}
число различных MyClass * X * является известным и исчерпывающим, и есть только один экземпляр каждого MyClass * X *, так что я хотел бы использовать перечисление:
public enum MyEnum {
MY_CLASS_1,
MY_CLASS_2;
}
чтобы быть в состоянии к и se MyEnum.MY_CLASS_1.run(someOtherClass1);
(например, у меня был бы каждый экземпляр MyInterface в одном месте). Возможно ли это (и если да, то как)? Потому что я совсем застрял теперь ...
То, что я пытался до сих пор:
public enum MyEnum {
MY_CLASS_1(new MyClass1()),
MY_CLASS_2(new MyClass2());
private MyInterface<?> instance;
private MyEnum(MyInterface<?> instance) {
this.instance = instance;
}
public void run(/* WhichType? */ e) {
instance.run(e);
}
}
В описанном выше способе, при использовании типа объекта для e
параметра:
public void run(Object e) {
instance.run(e);
// ^^^
// The method run(capture#3-of ?) in the type MyInterface<capture#3-of ?> is not applicable for the arguments (Object)
}
Проблема, я думаю, с этим полем private MyInterface<?> instance
: Мне нужно знать, как параметрируется экземпляр, используя что-то вроде private MyInterface<T> instance
, но я не могу найти рабочего решения .. .
Короче говоря, я застрял;)
PS: так как run
методы тела могут быть довольно долго, я стараюсь избегать анонимных классов в перечислении:
public enum MyEnum {
MY_CLASS_1 {
/* any method, etc. */
},
MY_CLASS_2 {
/* any method, etc. */
},
}
MyEnum
тогда станет совершенно нечитаемым.
Хорошее объяснение, но мне не нравится решение для его отсутствия безопасности типа. –
@PaulBellora: Мне тоже это не нравится :). И это даже не решение, а просто обходное решение. Он подходит только в том случае, если вы не можете жить без переименования (перебирать значения, получать значения по имени, ординалам, шкафам переключения и т. Д.) –
@ sp00m: Я отредактировал образец кода обратно, показывая параметризованную версию как первый вариант , чтобы решить вашу конкретную проблему: «Мне нужно знать, как настроен экземпляр *» –