我有多个实现方法create
的类。
public TeamScorePk create(TeamScore entity) {
TeamScorePk pk = entity.getPk();
if (!pk.validate()) {
throw new IllegalArgumentException("Part of primary key is null:" + entity);
}
if (INSTANCES.containsKey(pk)) {
throw new IllegalArgumentException(entity + " already exists.");
}
INSTANCES.put(pk, entity);
return pk;
}
地图INSTANCES
就像数据库表一样。
不同类中create
方法的唯一区别是它使用的类型。因此,我想把这个方法放到一个抽象的超类中。问题在于地图INSTANCES
,因为我必须从扩展类中获取它。我可以声明抽象方法getInstances,但是我应该返回它的Map类型的问题。如果我使用类似Map<? extends Pk, ? extends Entity>
的内容,那么在将类型Pk
和Entity
放入其中时,我自然会得到错误。
有人可以给我一个例子或一些建议,抽象类应该如何?
答案 0 :(得分:1)
public abstract class BaseClass<P extends Pk, E extends Entity> {
protected abstract Map<P, E> getInstances();
}
public class ChildClass extends BaseClass<TeamScorePk, TeamScore> {
protected Map<TeamScorePk, TeamScore> getInstances() {
// ...
}
}
答案 1 :(得分:1)
我会使用子类将处理的键和值的类型使抽象超类通用。
public abstract class SomeSuperclass<K extends Pk, V extends Entity> {
然后,您可以将算法放在具体方法中。
public K create(V entity) {
K pk = entity.getPk();
if (!pk.validate()) {
throw new IllegalArgumentException("Part of primary key is null:" + entity);
}
if (getInstances().containsKey(pk)) {
throw new IllegalArgumentException(entity + " already exists.");
}
getInstances().put(pk, entity);
return pk;
}
public abstract Map<K, V> getInstances();
}
我已将INSTANCES
替换为getInstances()
,这是一个子类将实现的抽象方法。
public class TeamScoreSubclass extends SomeSuperClass<TeamScorePk, TeamScore> {
然后所有子类必须提供Map
(并以某种方式填充它)。
Map<TeamScorePk, TeamScore> map = new HashMap<>;
和
public Map<TeamScorePk, TeamScore> getInstances() {
return map;
}
}