Я предполагаю, что вы путаете FOO как подтип с MyClass, когда он фактически является экземпляром.
С помощью "обычных" обобщений вы указываете тип, который будет заполнителем:
public class GenericClass <T extends Object> { // a bit contrived here
private T generic;
}
который создается
GenericClass<String> gen = new GenericClass<>(); // String is a subclass of Object
, затем он компилируется в
public class GenericClass {
private String generic;
}
Обратите внимание, что для String нет значения. Строкового экземпляра нет. Чтобы сделать это, нам либо нужен установщик или конструктор:
public class GenericClass<T extends Object> {
private T generic;
public GenericClass(T generic) {
this.generic = generic;
}
}
GenericClass<String> gen = new GenericClass<>("Passing in a String because T was a String");
или
GenericClass<Integer> gen2 = new GenericClass<>(2); // T is integer so we can only pass integers - 2 will be the instance.
Так что для Enum в качестве универсального типа мы указываем тип, который является MyType. Значение будет FOO, поэтому снова нам понадобится либо установщик, либо конструктор:
public class MyClass<T extends MyTypes> {
private T theType;
public MyClass(T theType) {
this.theType = theType;
}
}
, и чтобы убедиться, что у нас есть экземпляр FOO, мы передаем его конструктору
MyClass<MyTypes> myInstanceWithFoo = new MyClass<>(MyTypes.FOO);
Надеюсь, это имеет смысл.