假设我有一个类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
andStatic...Information
类,我应该如何解决这个问题?
提前致谢。
更新:
我已经对其进行了广泛的搜索,但没有找到任何更好的解决方案,特别是如果无法修改现有的类,因为它是访问者模式所需要的。正如这里的评论中所指出的,人们可以做一些反射魔法来做同样的事情,但据我所知,instanceof 无论如何都是“光”反射。