我有:
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
答案 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
}