要指定接口的绑定并使其成为枚举,您需要一个通用 交集 ,该 交集 如下所示:
class MyClass<T extends Enum<T> & SomeInterface> {}
请注意,在将一个类和一个接口相交时,该类必须出现在接口之前。
在这种情况下,所需的通用功夫要复杂一个级别,因为TrainingActions枚举的接口本身必须引用动物类型。
class Trainer<A extends Animal, T extends Enum<T> & TrainingActions<A>> {}
根据您发布的代码,一个完整的工作示例可以编译为:
public class Animal {}public interface TrainingActions<T extends Animal> {}public abstract class Trainer<A extends Animal, T extends Enum<T> & TrainingActions<A>> { private Set<T> completed = new HashSet<T>(); public void trainingComplete(T t) { completed.add(t); }}public class Dog extends Animal {};public class DogTrainer extends Trainer<Dog, DogTrainer.Trainables> { public enum Trainables implements TrainingActions<Dog> { BARK, BITE, ROLLOVER, FETCH; }}
但是,我将更进一步,并
TrainingActions在
Animal它们适用的特定类中定义几个枚举:
public class Dog extends Animal { public enum BasicTrainables implements TrainingActions<Dog> { SIT, COME, STAY, HEEL; } public enum IntermediateTrainables implements TrainingActions<Dog> { BARK, BITE, ROLLOVER, FETCH; } public enum AdvacedTrainables implements TrainingActions<Dog> { SNIFF_DRUGS, FIND_PERSON, ATTACK, GUARD; }};public class PuppyTrainer extends Trainer<Dog, Dog.BasicTrainables> {}public class ObedienceTrainer extends Trainer<Dog, Dog.IntermediateTrainables> {}public class PoliceTrainer extends Trainer<Dog, Dog.AdvacedTrainables> {}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)