1

假设我有一个类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...InformationandStatic...Information类,我应该如何解决这个问题?

提前致谢。

更新:

我已经对其进行了广泛的搜索,但没有找到任何更好的解决方案,特别是如果无法修改现有的类,因为它是访问者模式所需要的。正如这里的评论中所指出的,人们可以做一些反射魔法来做同样的事情,但据我所知,instanceof 无论如何都是“光”反射。

4

0 回答 0