使用带泛型的MutableClassToInstanceMap编译错误

时间:2010-03-21 02:22:47

标签: java collections guava

我收到以下编译错误“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
    }

}

2 个答案:

答案 0 :(得分:4)

与常规putInstance相反,put方法的目的是提供编译时类型的安全性。在这种情况下,您和我可以很容易地推断出number必须是number.getClass()给出的类型,但对于编译器来说,该信息是“丢失的”。也就是说,就而言,可能number是一个整数而number.getClass()是Long.class;它不够“聪明”,无法弄清楚这是安全的。

解决方案:只需使用put()!您仍然可以获得运行时检查,之后仍然可以使用类型安全的getInstance()方法,例如在Long l = this.identifiers.getInstance(Long.class);中。

(最后提示:请注意,因为Long.classlong.class都可以存在于ClassToInstanceMap中并映射到不同的值!)

答案 1 :(得分:0)

凯文的答案很棒。此外,您可以从方法定义中判断编译器不允许调用:

  • putInstance要求(在您的情况下)Class<Number>
  • number.getClass()提供Class<? extends Number>

这不是直接的子类。一些方差和协方差谈话在这里很有用。