Ошибка компиляции с использованием MutableClassToInstanceMap с Generics - PullRequest
2 голосов
/ 21 марта 2010

Я получаю следующую ошибку компиляции «Метод putInstance (Class, T) в типе MutableClassToInstanceMap не применим для аргументов (Class, Number)» при вызове метода putInstance.Кто-нибудь знает, что я делаю не так?Спасибо!

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 ]

4 голосов
/ 22 марта 2010

Цель метода putInstance, в отличие от обычного put, - обеспечить безопасность типа времени компиляции . В этом случае вы и я легко можем предположить, что number должен иметь тип, заданный number.getClass(), но для компилятора эта информация «потеряна». То есть, насколько известно , это , может быть, number является целым числом, а number.getClass() является Long.class; он не настолько «умен», чтобы понять, что это безопасно.

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

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

0 голосов
/ 22 марта 2010

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

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

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

...