[英]Does Java not support Covariant Return Types on Enums?
我正在尝试实现一种工厂模式,用户可以在其中从一组定义的选项中进行选择。 为了便于存储在数据库中,我将选项设置为枚举。 现在在一种情况下,我需要恢复特定的实现。 我希望避免显式实例化特定的实现,因为我的工厂缓存了它创建的东西的一些共享依赖项。 我以为我可以使用协变返回类型来完成此操作,但似乎它们不适用于枚举。 我假设它与枚举如何不能利用泛型类型有关(这也可以解决我的问题。)那么,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()
返回的值最具体的 static 类型将是Door
的类型。
EXTERIOR
具有类型DoorFactory implements IDoorFactory
。 因此DoorFactory.EXTERIOR.getDoor()
具有类型Door
,而不是类型ExteriorDoor
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.