【发布时间】:2011-05-31 10:12:07
【问题描述】:
我有以下代码:
import java.util.*;
public class SellTransaction extends Transaction {
private Map<String,? extends Object> origValueMap;
public SellTransaction(Map<String,? extends Object> valueMap) {
super(Transaction.Type.Sell);
assignValues(valueMap);
this.origValueMap=valueMap;
}
public SellTransaction[] splitTransaction(double splitAtQuantity) {
Map<String,? extends Object> valueMapPart1=origValueMap;
valueMapPart1.put(nameMappings[3],(Object)new Double(splitAtQuantity));
Map<String,? extends Object> valueMapPart2=origValueMap;
valueMapPart2.put(nameMappings[3],((Double)origValueMap.get(nameMappings[3]))-splitAtQuantity);
return new SellTransaction[] {new SellTransaction(valueMapPart1),new SellTransaction(valueMapPart2)};
}
}
调用valueMapPart1.put和valueMapPart2.put时代码编译失败,报错:
类型Map中的put(String, capture#5-of ? extends Object)方法不适用于参数(String, Object)
我在 Internet 上阅读了有关泛型、通配符和捕获的信息,但我仍然不明白出了什么问题。我的理解是Map 的值可以是任何扩展 Object 的类,我认为这可能是多余的,因为所有类都扩展 Object。而且我不能将泛型更改为? super Object 之类的东西,因为Map 是由某个库提供的。
那么为什么不编译呢?另外,如果我尝试将 valueMap 转换为 Map<String,Object>,编译器会给出“未经检查的转换”警告。
谢谢!
【问题讨论】:
标签: java generics compiler-errors