2017-01-22 11 views
0

Как это может быть так, что ArrayList<Class<?>> имеет такое же стирание ArrayList<Object>, но не может быть отброшено на него?То же стирание, но не такое же.

В настоящее время мой код переключается между двумя ошибками затмения.

GenericExclusiveSelectionPanel transport = 
       new GenericExclusiveSelectionPanel(StringConstants.TRANSPORT, 
        (ArrayList<Object>)TransportManager.getInstance().getTransportTypes()); 

, который показывает:

Cannot cast from ArrayList<Class<Transportable>> to ArrayList<Object> 

Если удалить бросание однако и создать конструктор:
GenericExclusiveSelectionPanel(String, ArrayList<Class<Transportable>>)

я получаю сообщение об ошибке затмения, что:

Erasure of method GenericExclusiveSelectionPanel(String, 
    ArrayList<Class<Transportable>>) is the same as another method in type 
    GenericExclusiveSelectionPanel 

It затем выделяет конструктор (ниже) как конфликтный конструктор.

GenericExclusiveSelectionPanel(String title, ArrayList<Object> arrayList) 
+2

Почему вы ожидаете, что один тип может быть отлит другим, потому что у них одинаковое стирание? – user2357112

+0

@LawrenceColes Пожалуйста, прочитайте [Что делать, если кто-то отвечает на мой вопрос] (http://stackoverflow.com/help/someone-answers). И да, Хороший вопрос. +1 от меня. Посмотрите на мой ответ и дайте мне знать, если вам нужно какое-либо разъяснение – CKing

ответ

0

Было бы легче понять, почему это происходит, если мы сначала понять, что тип стирания означает относительно Дженерики в Java. Взгляните на type erasure из документации Oracle перед продолжением.

Теперь, когда вы знаете, что означает стирание стилей, давайте посмотрим, что говорит о документации Oracle около generics.

Из документации должно быть ясно, что основная цель Generics должна была обеспечить более строгие проверки времени компиляции. Было бы довольно противоречием, если бы компилятор не применял проверку на литье с дженериками. Ради обсуждения, рассмотрим гипотетически, что следующие утверждения были допущены:

List<String> strings = new ArrayList<String>();//1 
strings.add("123");//2 
List<Object> objects = strings;//3 
objects.add(1);//4 

Если компилятор не ограничивает назначение на шаге 3, вы могли бы добавить Integer в список String объектов. Что хорошего Generics в первую очередь, если компилятор не жалуется на назначение на шаге 3, что, в свою очередь, позволяет нам перейти к шагу 4?

Аналогичным образом, в то время как ArrayList<Class<Transportable>> и ArrayList<Object> имеют одинаковое стирание, компилятор прав, жалуясь на их назначение, как объяснялось выше. В заключение, ограничение этих отливок на Generics так же важно, как ограничение конструкторов/методов с тем же стиранием.

 Смежные вопросы

  • Нет связанных вопросов^_^