【问题标题】:Generic method receives generic enum通用方法接收通用枚举
【发布时间】:2016-12-15 08:20:02
【问题描述】:

我想让我的泛型方法接收一个枚举类型,其中包含我想从该方法返回的类。

这就是我走了多远(例如):

public class Zoo {
   public Monkey apu;
   public Lion simba;
   public Bird zazu;

   public <T extends Animal> T getAnimal(String animal, Animaltype animaltype){
      switch(animal){
         case "apu":
            return animaltype.getType().cast(zoo.feedAnimal(animaltype.getType()))
         case "simba":
            return ??????????????
         case "zazu":
            return ??????????????
      }
   }
}

public enum Animaltype {
   MONKEY(Monkey.class),
   LION(Lion.class),
   BIRD(Bird.class);

   Class <?> enumClass;

   Animaltype(Class<?> enumClass) {
      this.enumClass = enumClass;
   }

   public Class<?> getType(){
      return this.enumClass;
   }
}

现在返回时说需要的是T,找到的是Object。

错误信息是: "需要不兼容的类型:T 找到了 Java.lang.Object

我不知道正确的语法

【问题讨论】:

  • 贴出导致编译错误的代码,以及准确完整的错误。
  • 不可能为“?????”填写一些内容那是完全类型安全的。你需要一个未经检查的演员表。

标签: java generics methods enums


【解决方案1】:

不起作用,因为Java不知道T的类型是什么。

一种可能的解决方案就是返回Animal。在这种情况下,您不需要任何转换。

public Animal getAnimal(String animal, Animaltype animaltype)

另外,您可以通过将Class&lt;T&gt; 传递给方法而不是Animaltype animaltype 来指定T 的类型。

public <T extends Animal> T getAnimal(String animal, Class<T> animaltypeClass){
      switch(animal){
         case "apu":
            return animaltypeClass.cast(zoo.feedAnimal(animaltypeClass))
         ...
      }
   }

但枚举中的字段 enumClass 也应该是 Class &lt;? extends Animal&gt; enumClass;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多