Java &引用;套;具有嵌套泛型的特定枚举类型的
这有点像是我之前的一次采访的后续报道 假设我有一个抽象的动物父类。同一种动物可以有不同的气质,可以在不同类型的表演中表演。所以我对动物的定义是这样的:Java &引用;套;具有嵌套泛型的特定枚举类型的,java,generics,enums,Java,Generics,Enums,这有点像是我之前的一次采访的后续报道 假设我有一个抽象的动物父类。同一种动物可以有不同的气质,可以在不同类型的表演中表演。所以我对动物的定义是这样的: public abstract class Animal<T extends Temperament, S extends Show>{...} 有人能帮我理解我做错了什么吗?找出了问题所在。我的具体培训师需要定义如下: public interface TrainingActions<T extends Animal<
public abstract class Animal<T extends Temperament, S extends Show>{...}
有人能帮我理解我做错了什么吗?找出了问题所在。我的具体培训师需要定义如下:
public interface TrainingActions<T extends Animal<?,?>>{...}
public abstract class Trainer
<A extends Animal<?,?>,
E extends Enum<E> & TrainingActions<A>,
T extends Temperament,
S extends Show>{
...}
public class DogTrainer
<T extends Temperament,
S extends Show> extends Trainer
<Dog<?,?>, DogTrainer.Trainables, T, S>{// changed line
public enum Trainables implements TrainingActions<Dog<?,?>>{
FETCH, GROWL, SIT, HEEL;
}
...
}
公共级驯狗师
扩展培训师
>{
拿,咆哮,坐,跟;
}
...
}
解决了这个问题。我的具体培训师需要定义如下:
public interface TrainingActions<T extends Animal<?,?>>{...}
public abstract class Trainer
<A extends Animal<?,?>,
E extends Enum<E> & TrainingActions<A>,
T extends Temperament,
S extends Show>{
...}
public class DogTrainer
<T extends Temperament,
S extends Show> extends Trainer
<Dog<?,?>, DogTrainer.Trainables, T, S>{// changed line
public enum Trainables implements TrainingActions<Dog<?,?>>{
FETCH, GROWL, SIT, HEEL;
}
...
}
公共级驯狗师
扩展培训师
>{
拿,咆哮,坐,跟;
}
...
}
通过在通用签名中添加许多约束,您已经创建了一个无法解决的问题。与您(假定)的意图相比,您当前的解决方案过于宽松。请看以下声明:
public abstract class Trainer
<A extends Animal<?,?>, // <- here you are not enforcing the right bounds
E extends Enum<E> & TrainingActions<A>,
T extends Temperament,
S extends Show>{
…
}
但是,您的解决方案不再有效。使用此声明,您无法创建具有气质
和显示
类型参数的DogTrainer
,而不按照预期将经过训练的动物声明为狗
,因为培训师
应该只训练具有正确气质
和显示
(否则,不需要将其设置为类型参数)
但是如果您将DogTrainer
声明为DogTrainer
扩展培训师
您不能指定您想要的培训动作
,因为它没有正确的气质
和显示
,这是不可能解决的,因为您希望培训动作
是一个枚举
。并且枚举
只能用通配符声明,就像您在thenum Traineables implements TrainingActions您在通用签名中添加了许多约束,从而造成了一个无法解决的问题。与您(假定)的意图相比,您当前的解决方案过于宽松。请查看以下声明:
public abstract class Trainer
<A extends Animal<?,?>, // <- here you are not enforcing the right bounds
E extends Enum<E> & TrainingActions<A>,
T extends Temperament,
S extends Show>{
…
}
但是,您的解决方案不再有效。通过此声明,您无法创建一个具有气质和显示类型参数的驯狗师,而不按照预期将经过训练的动物声明为狗,因为驯狗师应该只训练具有正确脾气的动物ament
和Show
(否则不需要将它们设置为类型参数)
但是如果您将DogTrainer
声明为DogTrainer
扩展培训师
您不能指定您想要的培训动作
,因为它没有正确的气质
和显示
,这是不可能解决的,因为您希望培训动作
是一个枚举
。并且枚举
只能用通配符声明,就像您在enum Traineables implements TrainingAction扫描您告诉我们错误是什么?刚刚添加了错误消息。您能告诉我们错误是什么吗?刚刚添加了错误消息。