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; } 

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

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

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