问题描述
我有一个抽象类,定义了要在图形中绘制的刻痕项目的结构。得分项目有多种变体。它们都有相同的实例变量,但是每个都有其自己的绘图实现,这既很大又很复杂。这些绘图实现主要由测角计算组成,几乎不共享任何代码。
为了保持代码的可读性,我想为每个变体使用一个子类。在子类中,我将定义绘图方法实现。请参见下面的简化示例。
abstract class ScoreItem {
int score;
Color color;
...
abstract void draw();
public class RadarItem extends ScoreItem {
@Override
public void draw() {
// RADAR IMPLEMENTATION
...
}
}
public class LineItem extends ScoreItem {
@Override
public void draw() {
// LINE IMPLEMENTATION
...
}
}
etc.
}
现在,我想使用一个Graphic类,其中有一个ScoreItems列表。该列表可以包含抽象ScoreItem的不同变体,并且该类必须在ScoreItems上循环才能绘制它们,如下所示:
public class Graphic {
...
public void generate() {
List<ScoreItem> scoreItems = ...;
for (ScoreItem scoreItem : scoreItems) { scoreItem.draw(); }
}
}
现在这应该可行;我在一个简单的测试项目中对其进行了测试。但是,我遇到了问题;图形类必须进行序列化,而我在反序列化方面遇到了麻烦。 (java.lang.RuntimeException:“类”字段未找到抽象类)不起作用。我认为GSON无法反序列化到抽象类中。当我将ScoreItem类更改为常规类时,显然GSON反序列化可以工作,但随后我不能在子类上使用draw()方法。
我希望我已经足够简洁地描述了这个问题。可能将List与不同的对象类型一起使用可能不是一个好习惯。任何解决方案或建议都将不胜感激。
解决方法
答案正确无误,解决方案是使用GSON接口适配器(已更改为抽象适配器)。
如here所述。