多个类中的相同方法,但使用不同的类型

时间:2014-03-10 19:41:38

标签: java abstract-class

我有多个实现方法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>的内容,那么在将类型PkEntity放入其中时,我自然会得到错误。

有人可以给我一个例子或一些建议,抽象类应该如何?

2 个答案:

答案 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;
   }
}