2010-03-21 104 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>

這不是一個直接的子類。一些方差和協方差說話在這裏可能很有用。