我收到以下编译错误“MutableClassToInstanceMap类型中的方法putInstance(Class,T)不适用于putInstance方法调用中的参数(Class,Number)”。有谁知道我做错了什么?谢谢!
public class TestMutableClassToInstanceMap {
public final MutableClassToInstanceMap<Number> identifiers = MutableClassToInstanceMap.create();
public static void main(String[] args) {
ArrayList<Number> numbers = new ArrayList<Number>();
numbers.add(new Integer(5));
TestMutableClassToInstanceMap test = new TestMutableClassToInstanceMap(numbers);
}
public TestMutableClassToInstanceMap(Collection<Number> numbers){
for (Number number : numbers) {
this.identifiers.putInstance(number.getClass(), number); //error here
}
this.identifiers.putInstance(Double.class, 5.0); // This works
}
}
答案 0 :(得分:4)
与常规putInstance
相反,put
方法的目的是提供编译时类型的安全性。在这种情况下,您和我可以很容易地推断出number
必须是number.getClass()
给出的类型,但对于编译器来说,该信息是“丢失的”。也就是说,就它而言,可能number
是一个整数而number.getClass()
是Long.class;它不够“聪明”,无法弄清楚这是安全的。
解决方案:只需使用put()
!您仍然可以获得运行时检查,之后仍然可以使用类型安全的getInstance()
方法,例如在Long l = this.identifiers.getInstance(Long.class);
中。
(最后提示:请注意,因为Long.class
和long.class
都可以存在于ClassToInstanceMap
中并映射到不同的值!)
答案 1 :(得分:0)
putInstance
要求(在您的情况下)Class<Number>
。number.getClass()
提供Class<? extends Number>
这不是直接的子类。一些方差和协方差谈话在这里很有用。