2010-03-21 133 views
2

我收到以下编译错误putInstance方法调用的参数(Class,Number)“类型MutableClassToInstanceMap中的方法putInstance(Class,T)”不适用。有谁知道我在做什么错?谢谢!使用MutableClassToInstanceMap与泛型编译错误

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 
    } 

} 

回答

4

putInstance方法的目的,而不是常规put,是提供编译时类型安全。在这种情况下,你和我可以很容易地推断number必须是number.getClass()给出的类型,但是对于编译器来说,这些信息是“丢失的”。也就是说,只要知道,也许number是一个Integer,而number.getClass()是Long.class;这并不“聪明”,足以证明这是安全的。

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

(最后的技巧:看出来,因为Long.classlong.class既可以在一个ClassToInstanceMap存在,并且被映射到不同的值)

0

凯文的答案是伟大的。此外,你可以从编译器不会允许呼叫的方法定义告诉:

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

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