Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;套;具有嵌套泛型的特定枚举类型的_Java_Generics_Enums - Fatal编程技术网

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

扩展培训师
您不能指定您想要的
培训动作
,因为它没有正确的
气质
显示
,这是不可能解决的,因为您希望
培训动作
是一个
枚举
。并且
枚举
只能用通配符声明,就像您在th
enum 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扫描您告诉我们错误是什么?刚刚添加了错误消息。您能告诉我们错误是什么吗?刚刚添加了错误消息。