List

У меня есть вопрос Java о дженериках. Я объявил общий список:

List listOfMyType; 

Затем в каком-то методе я пытаюсь создать экземпляр и добавить элементы в этот список:

 listOfMyType = new ArrayList(); listOfMyType.add(myTypeInstance); 

Где myTypeInstance – это просто объект типа MyType ; он не будет компилироваться. В нем говорится:

Метод add (capture # 3-of? Extends MyType) в типе List не применим для аргументов (MyType)

Есть идеи?

Вы не можете делать «put» с расширениями. Посмотрите на правило Generics – Get and Put .

Рассматривать:

 class MySubType extends MyType { } List subtypeList = new ArrayList(); List list = subtypeList; list.add(new MyType()); MySubType sub = subtypeList.get(0); 

sub теперь содержит MyType что очень неправильно.

Вам не нужно использовать синтаксис захвата подстановки в вашем случае, просто объявляя

 List listOfMytype; 

должно быть достаточно. Если вы хотите точно знать, почему в учебнике Java Generics больше, чем вы хотели бы узнать об эзотерическом безумии Java Generics. В вашем конкретном случае.

Что касается того, почему добавление с подстановочным знаком не работает, это связано с тем, что компилятор не может точно определить, какой подclass MyType будет отображаться в каждом случае, поэтому компилятор испускает ошибку.

Здесь есть аналогичный stream: как добавить элементы в общую коллекцию подстановочных знаков?

Чтобы получить представление о том, как работают дженерики, ознакомьтесь с этим примером:

  List sfoo = new ArrayList(); List foo; List tmp; tmp = sfoo; foo = (List) tmp; 

Дело в том, что это не было предназначено для локальных / членных переменных, но для сигнатур функций, поэтому это так задне-назад.

Я не знаю, действительно ли это поможет вам, но это то, что мне пришлось использовать, вызывая общий метод Spring Framework и желая вернуть также общий список:

 public  List findAll(String tableName,Class table) { String sql = "SELECT * FROM "+ tableName ; List entities = getSimpleJdbcTemplate().query(sql, ParameterizedBeanPropertyRowMapper.newInstance(table)); return (List) entities; } 

Кажется, вам нужно использовать параметризацию? войдите в список, чтобы получить результаты, а затем отнести список к ожидаемому типу возврата.

Я все еще ослеплен дженериками …

Interesting Posts

Более быстрая версия гребенки

Как заставить колесико мыши прокручивать управление под курсором мыши?

NotificationCompat с API 26

Использование XSL-FO, CSS3 вместо CSS2 для создания разбитых на страницы документов, таких как PDF?

myView.frame.origin.x = значение; не работает. Но почему?

Где документация для метода values ​​() для Enum?

Покупка другого маршрутизатора и использование в качестве «ретранслятора сигнала» в режиме моста?

Общее ограничение для сопоставления числовых типов

Как обмениваться фотографиями между двумя MacBook Pro по беспроводной сети?

NetBSD и TP-Link TL-WN727N (Atheros AR9271 или Ralink RT5370)

Определения @property с ARC: сильные или сохраняются?

Элемент HTML5 на Android

Отображение динамического изображения из базы данных с помощью p: graphicImage и StreamedContent

Экспорт-CSV экспортирует длину, но не имя

Что означает, если ваш ноутбук для Windows показывает «Рассмотрите возможность замены батареи»?

Давайте будем гением компьютера.