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

cu6pst1q  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(417)

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

  1. public class Scratch
  2. {
  3. public static class Door { }
  4. public static class ExteriorDoor extends Door { }
  5. public interface IDoorFactory
  6. {
  7. public Door getDoor();
  8. }
  9. public enum DoorFactory implements IDoorFactory
  10. {
  11. EXTERIOR
  12. {
  13. @Override
  14. public ExteriorDoor getDoor()
  15. {
  16. //valid covariant method override
  17. return new ExteriorDoor();
  18. }
  19. },
  20. INTERIOR
  21. {
  22. @Override
  23. public Door getDoor()
  24. {
  25. return new Door();
  26. }
  27. }
  28. }
  29. public static void main(String[] args)
  30. {
  31. //invalid, method only returns a Door
  32. ExteriorDoor door = DoorFactory.EXTERIOR.getDoor();
  33. }
  34. }
tnkciper

tnkciper1#

枚举常量是字段,而不是类型。返回类型是协变的,但枚举常量的类型是匿名类。因此,返回的值的最特定静态类型 getDoor() 你的例子就是 Door .

rjee0c15

rjee0c152#

EXTERIOR 有类型 DoorFactory implements IDoorFactory . 因此 DoorFactory.EXTERIOR.getDoor() 有类型 Door ,不是类型 ExteriorDoor .

相关问题