泛型地图 - 避免众多演员阵容

时间:2014-03-21 15:44:37

标签: java generics hashmap

我有:

public abstract class Report {
    protected Map<String, Transaction> m = new HashMap<String, Transaction>();
    // more stuff
}

public class TRRTransaction extends Transaction {
    public String someMethodOnlyInTRRTransaction() {
        // do stuff
    }

    @Override
    public void someInheritedMethod() {
        // do stuff
    }
    // more stuff
}

public class TRRReport extends Report {
    public void doSomething() {
        for (B b : m.values()) {
            query.setString(1, ((TRRTransaction) b).someMethodOnlyInTRRTransaction());
        }
    }
    // more stuff
}

我试图避免在所有地方明确地投射到TRRTransaction。就我而言,TRRReport只会在其继承的TRRTransaction中处理HashMap。还有其他类型的Report子类,每个类只处理它的相关类型Transaction。除了从HashMap移除Report并将其本地移动到Report的每个子类之外,我不确定还能做些什么。

我有一个类似的问题,但我想我可能会以错误的方式提出问题并且没有直接回答:HashMap using Generics

2 个答案:

答案 0 :(得分:5)

您需要使您的课程具有通用性:

public abstract class Report<T extends Transaction> {
    protected Map<String, T> m = new HashMap<String, T>();
    // more stuff
}

public class TRRTransaction extends Transaction {
    public String someMethodOnlyInTRRTransaction() {
        // do stuff
    }

    @Override
    public void someInheritedMethod() {
        // do stuff
    }
    // more stuff
}

public class TRRReport extends Report<TRRTransaction> {
    public void doSomething() {
        for (B b : m.values()) {
            query.setString(1, b.someMethodOnlyInTRRTransaction());
        }
    }
    // more stuff
}

答案 1 :(得分:4)

您可以使Report类具有通用性,上限为Transaction

public abstract class Report<T extends Transaction> {
   protected Map<String, T> m = new HashMap<String, Transaction>();

然后子类TRRReport可以将T定义为TRRTransaction

public class TRRReport extends Report<TRRTransaction> {
    public void doSomething() {
        for (TRRTransaction b : m.values()) {
            query.setString(1, b.someMethodOnlyInTRRTransaction());
        }
    }
    // more stuff
}