我正在尝试访问存储在 map 中的自定义 Java 泛型,如下所示。
不幸的是,我遇到了类型不匹配错误。
现在,我可以将其转换为我想要的类型,因为但这对我来说似乎很困惑。
有没有一种干净的方法来完成作业?
谢谢
public interface BusinessObject {
}
public class SalesItemA implements BusinessObject {
}
public interface BusinessRuleSuite<T extends BusinessObject> {
public void fire(T shell);
}
public abstract class BusinessRuleSuiteCommon<T extends BusinessObject>
implements BusinessRuleSuite<T> {
public synchronized void fire(T bo) {
// do something with bo;
}
}
public class SalesBusinessRuleSuite extends
BusinessRuleSuiteCommon<SalesItemA> {
}
public class SalesProcessor {
private final Map<Class<? extends BusinessObject>, BusinessRuleSuite<? extends BusinessObject>> businessRules;
public SalesProcessor(Map<Class<? extends BusinessObject>, BusinessRuleSuite<? extends BusinessObject>> businessRules) {
this.businessRules = businessRules;
}
public void processItem(SalesItemA sia) {
/// This assignment doesn't work??? Why?
BusinessRuleSuite<SalesItemA> p = this.businessRules.get(sia.getClass());
p.fire(sia);
}
}
}
最佳答案
因为get()
的返回类型是 BusinessRuleSuite<? extends BusinessObject>
.
这意味着它将接受任何继承自 BusinessObject
的东西在put()
期间.但是当你在赋值语句的右边使用它时,Java 就不能做假设了。它必须安全起见,所以 get()
表现得就像你使用了 BusinessRuleSuite<BusinessObject>
(没有 extends
)。
有两种方法可以实现你想要的:
使用
BusinessRuleSuite<SalesItemA>
在 map 声明中使用强制转换
关于java - 访问存储在 Map 中的 Java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1300841/