2010-03-21 1 views
2

Я получаю следующую ошибку компиляции «Метод putInstance (класс, T) в типе MutableClassToInstanceMap не применим для аргументов (класс, число)» при вызове метода putInstance. Кто-нибудь знает, что я делаю неправильно? Благодаря!Ошибка компиляции с использованием 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 is Integer и number.getClass() Long.class; это не «разумно», чтобы понять, что это безопасно.

Решение: используйте только put()! Вы по-прежнему получаете проверки времени выполнения, и после этого вы можете использовать метод typeafe getInstance(), например, в Long l = this.identifiers.getInstance(Long.class);.

(Final Кончик: берегитесь, потому что Long.class и long.class оба могут существовать в ClassToInstanceMap и быть сопоставлены с различными значениями)

0

ответ Кевина велик. Кроме того, вы можете сказать, из определения метода, что компилятор не собирается разрешить вызов:

  • putInstance требует (в вашем случае) Class<Number>.
  • number.getClass() обеспечивает Class<? extends Number>

который не является прямым подклассом. Здесь могут быть полезны некоторые разногласия и ковариационные разговоры.