2 回答
TA贡献1853条经验 获得超9个赞
您可以将泛型类型添加到ApplicationFactory.
public class MainJava {
interface Frame{}
interface FrameMap<T extends Frame>{}
static class App1Frame implements Frame{}
static class App2Frame implements Frame{}
static class App1FrameMap implements FrameMap<App1Frame>{}
static class App2FrameMap implements FrameMap<App2Frame>{}
interface ApplicationFactory<T extends Frame> {
T makeFrame();
FrameMap<T> makeFrameMap();
}
static class App1Factory implements ApplicationFactory<App1Frame> {
@Override public App1Frame makeFrame() {
return new App1Frame();
}
@Override public FrameMap<App1Frame> makeFrameMap() {
return new App1FrameMap();
}
}
public static void main(String... args) {
ApplicationFactory<? extends Frame> factory = new App1Factory();
Frame frame = factory.makeFrame();
FrameMap<? extends Frame> map = factory.makeFrameMap();
}
}
另请注意,ApplicationFactory应将对象注入客户端。如果客户端直接调用new App1Factory(),那么抽象是没有意义的。客户端还不如App1Factory创建后使用。
TA贡献1909条经验 获得超7个赞
除了@jaco0646 解决方案,还有一种简单的方法可以解决将新创建的框架添加到地图的问题,即使您在运行时不知道实际的子类型或“族”。只要您可以将 frame 和 frame-map 类型参数绑定为在方法中具有相同的值,如下所示:
public static <T extend Frame> FrameMap<T> makeAndAdd(final AbstractFactory<T> factory) {
T frame = factory.makeFrame();
FrameMap<T> map = factory.makeFrameMap();
map.add(frame);
return map;
}
当不可能将两个动作放在同一个方法中时(例如,在不同的服务器调用上异步发生)。您仍然可以通过使用另一个具有类型参数并且具有这些操作的不同方法的类来实现这种联系......这有点复杂,需要根据实际问题进行调整,但想法是相同的从某种意义上说,您使用类型参数将在运行时赋予不同对象的类型参数值联系起来。
添加回答
举报