Java不支持枚举上的协变返回类型吗?

我正在尝试实现一个工厂模式,用户可以从一组定义的选项中进行选择。为了便于存储在数据库中,我将选项设为枚举。现在在一种情况下,我需要取回特定的实现。我希望避免显式实例化特定的实现,因为我的工厂缓存了它创建的事物的一些共享依赖项。我以为我可以使用协变返回类型来实现这一点,但它们似乎不适用于枚举。我假设它与枚举如何不能利用泛型类型有关(这也可以解决我的问题。)那么,Java 是否不支持枚举中方法的协变返回类型?

public class Scratch
{
   public static class Door  {      }    
   public static class ExteriorDoor extends Door  {  }  
   public interface IDoorFactory  
   {    
      public Door getDoor();
   }

   public enum DoorFactory implements IDoorFactory
   {
       EXTERIOR
       {
          @Override
          public ExteriorDoor getDoor()
          {
             //valid covariant method override
             return new ExteriorDoor(); 
          }
       },
       INTERIOR
       {
          @Override
          public Door getDoor()
          {
            return new Door();
          }
        }
    }  

   public static void main(String[] args)  
   {
    //invalid, method only returns a Door
    ExteriorDoor door = DoorFactory.EXTERIOR.getDoor();  
   }
}

回答

枚举常量是字段,而不是类型。返回类型是协变的,但枚举常量的类型是匿名类。出于这个原因,getDoor()您的示例中返回的值的最具体的静态类型将是Door.


以上是Java不支持枚举上的协变返回类型吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>