假设我有一个班级StaticVehicleInformation
,其中包含有关车辆的“静态”信息,例如它的类型,序列号或颜色。
现在我有一个跟踪应用程序来跟踪驾驶车辆并在地图上显示它们。在这种情况下,StaticVehicleInformation
包含在DynamicVehicleEntry<? extends StaticVehicleInformation>
中,基本上会添加“动态”信息,例如currentPosition,speed或currentDriver。同时它有一个方法<T extends StaticVehicleInformation> <T> getStaticVehicleInformation()
来返回包装的静态信息。
在我的地图中或基本上在显示不同移动车辆的任何视图中,因此主要处理List<DynamicVehicleEntry <? extends StaticVehicleInformation>
,我需要区分我正在处理的实际类型的车辆以显示不同的图标等等。因此,通过具体DynamicVehicleEntry
类(DynamicCarEntry extends DynamicVehicleEntry <StaticCarInformation>
,DynamicMotorcycleEntry extends DynamicVehicleEntry <StaticMotorcycleInformation>
,...),我得到了不同类型的实时跟踪车辆,具有不同的静态和 - 如果需要 - 特定的“动态”属性(在DynamicVehicleEntry
)的子类中。
由于我的目标是将数据与UI分开,因此我构建了一个工厂,根据应显示的DynamicVehicleEntry
类型返回不同的UI元素:
// .... Factory....
public static Node createNewControlFromType(DynamicVehicleEntry <? extends StaticVehicleInformation> entry) {
// from specific to general
if (entry instanceof DynamicCarEntry) {
return new CarControl(entry);
} else if (entry instanceof DynamicMotorcycleEntry) {
return new MotorcycleControl(entry);
} else {
// no concrete UI-Method found, so return a generic Control showing a dummy-icon
// and only the most generic information common to every DynamicVehicleEntry and the wrapped StaticVehicleInformation
return new GenericControl(entry);
}
}
instanceOf
闻起来,我认为仿制品的类型擦除也可能会打破我的脖子。假设我无法修改Static...Information
和Static...Information
类,我应该如何解决这个问题?
提前致谢。
更新
我已经对它进行了一些广泛的搜索,并没有找到更好的解决方案,特别是如果一个人无法修改现有的类,因为访问者模式需要它。正如评论here中所指出的那样,人们可以做一些反思魔术来做同样的事情,但从我的理解中,无论如何都是“光”反射。