我正在尝试实现一个工厂模式,用户可以从一组已定义的选项中进行选择。为了便于存储在数据库中,我将选项设置为枚举。现在在一个例子中,我需要得到具体的实现回来。我希望避免显式示例化特定的实现,因为我的工厂缓存了它创建的东西的一些共享依赖项。我假设可以使用协变返回类型来实现这一点,但它们似乎不适用于枚举。我假设这与枚举不能利用泛型类型有关(这也解决了我的问题),那么,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();
}
}
2条答案
按热度按时间tnkciper1#
枚举常量是字段,而不是类型。返回类型是协变的,但枚举常量的类型是匿名类。因此,返回的值的最特定静态类型
getDoor()
你的例子就是Door
.rjee0c152#
EXTERIOR
有类型DoorFactory implements IDoorFactory
. 因此DoorFactory.EXTERIOR.getDoor()
有类型Door
,不是类型ExteriorDoor
.