Подтип, когда аргумент типа является параметризованным типом - PullRequest
0 голосов
/ 11 апреля 2019

Скажем, у нас есть List<List<String>> и List<List<?>>.

Очевидно, аргумент типа? содержит аргумент типа String, и, следовательно, List<?> является прямым супертипом List<String>.

Однако, как работает подтип, когда аргументы типа являются параметризованным типом. Итак, является ли List<List<?>> супертипом List<List<String>>? И если да, то почему?

1 Ответ

1 голос
/ 11 апреля 2019

List<List<?>> - это , а не . Супертип List<List<String>>.

List<List<?>> означает, что этот объект является списком, содержащим списки неизвестных объектов.

List<List<String>> означает, что этот объект является списком, содержащим списки String объектов.

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

ОБНОВЛЕНИЕ:

Хорошо, вот несколько подробных объяснений.

Знак вопроса (?) означает: «любой возможный типобъекта "или" любого объекта, расширяющего Object и самого Object ".Примерно List<?> можно считать List<Object>.

Является ли Object супертипом String?Да, это.Но рассмотрим этот пример:

class A {

}

List<A> list1 = new ArrayList<>();                 
List<String> listOfStrings = new ArrayList<>();
List<?> unknownList = list1;

Означает ли это, что unknownList содержит объекты супертипов String? Нет .
Это только означает, что этот список может содержать любой объект, который расширяет Object или Object сам по себе и должен обрабатываться соответствующим образом.

...