Несовместимые типы: Список <A>не может быть преобразован в Список <U> - PullRequest
0 голосов
/ 25 апреля 2019

Может ли кто-нибудь объяснить мне, почему этот кусок кода не компилируется? Когда я заменяю U на ?, это работает. Почему это не выводится как Object?

class Scratch {
    static <U> List<U> method(int x) {
        if (x < 50) {
            return new ArrayList<String>();
        } else {
            return new ArrayList<Number>();
        }
    }
}

1 Ответ

0 голосов
/ 25 апреля 2019

Поскольку ArrayList<Object> и скажем ArrayList<String> не являются связанными типами, то есть ArrayList<String> не наследуется от ArrayList<Object> и не может быть преобразовано в него.

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


ArrayList<String> stringList = ...;

ArrayList<Object> objectList = stringList; // this is what is not allowed in reality

objectList.add(new Integer());

Теперь у вас есть целое число в stringList, что определенно не то, что вы ожидаете получить в программе типа safe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...