2012-06-25 4 views
0

У меня есть параметризованный общий класс X, который принимает тип T. На котором не было определено никаких условий (например, T extends/tools).Autoboxing не работает с параметризованными типами

class X <T> { 
    Map<T, String> map = new HashMap<T, String>(); 

    public void put() { 
     map.put((T)getLong(), ""); 
    } 

    public long getLong() { 
     return 0L; 
    } 
} 

Мы знаем, что T определенно является типом объекта, а не примитивным. Поэтому я ожидал бы, что возвращаемое «длинное» значение будет «Автобокс» до «Лонг», после чего последует приведение к Т, но этого не произойдет.

Компилятор говорит: «Невозможно отложить от длинного до Т». Если заменить параметризованный тип T на «Long», проблем нет. Может ли кто-нибудь объяснить, почему Java не поддерживает autoboxing примитивных типов при использовании параметризованного типа? Есть что-то, чего я не хватает?

Спасибо!

+1

Предполагая, что все вышеперечисленное будет работать только с Long, как T. Вы получите «ClassCastException» для любой другой параметризации. Итак, что вы пытаетесь выполнить с помощью Generics? –

+0

Спасибо за ответ. К сожалению, да, здесь мы можем предположить, что T и Long являются совместимыми типами. Не очень беспокоиться о запуске ClassCastException, но ошибка компиляции, которая ползет. –

+0

Если вы добавили '', это может сработать. –

ответ

2

Я думаю, сначала вы должны автобокс, а затем бросить на Т. Это должно быть написано следующим образом.

public Long getLong() { //not long, because it's primitive 
     return 0L; 
    } 

Таким образом автооблок происходит, когда этот метод возвращается. Что происходит в вашем случае, это не autobox long primitive, и вы пытаетесь применить этот длинный примитив к T., которого вы просто не можете сделать.

+0

Пожалуйста, подтвердите, если он сработает для вас .. – Ahmad

+0

Да, это работает как шарм. Благодаря! Интересно, почему Java накладывает такое ограничение. –

+1

@ kryptic .. это не ограничение человека .. просто вы слишком много ожидаете от java. – Ahmad