Родовой родительский класс

В соответствии с пробником Generics,

В этом разделе указано:

Учитывая два конкретных типа A и B (например, Number и Integer), MyClass<A> не имеет отношения к MyClass<B>, независимо от того, связаны ли A и B или нет. Общий родительский элемент MyClass<A> и MyClass<B> - это Object.

Тем не менее, здесь нам говорят,

Хотя Integer является подтипом Number, List<Integer> не является подтипом List<Number> и, фактически, эти два типа не связаны. Общий родительский элемент List<Number> и List<Integer> равен List<?>.

Почему в первом примере MyClass<?> нет родителя MyClass<A>/MyClass<B>? В чем заключается различие?

Ответы

Ответ 1

Я думаю, что ответ довольно тривиален. Хотя правильный родительский элемент MyClass<A> и MyClass<B> действительно MyClass<?>, учебник сделал небольшое упрощение там, поскольку подстановочные знаки еще не были введены.

Точка слова

Общий родительский элемент MyClass<A> и MyClass<B> равен Object.

просто для того, чтобы было ясно, что ни один из двух типов не является родителем другого, независимо от отношения между A и B.

Это подтверждается следующим комментарием ниже вашей первой цитаты:

Информацию о том, как создать отношение типа подтипа между двумя универсальными классами, когда параметры типа связаны, см. в разделе "Подстановочные знаки" и "Подтипирование".

а также введением главы Подстановочные знаки и подтипирование:

Как описано в Generics, Inheritance и Subtypes, общие классы или интерфейсы не связаны только потому, что существует взаимосвязь между их типами. Тем не менее, вы можете использовать подстановочные знаки для создания отношений между универсальными классами или интерфейсами.

Ответ 2

Сразу после первой цитаты из учебника говорится:

Информацию о том, как создать подтипоподобное отношение между два общих класса, когда параметры типа связаны, см. Wildcards и подтипирование.

который является ссылкой на вашу вторую цитату.

Итак, хотя я считаю, что он вводит в заблуждение и не очень хорошо сформулирован, я бы прочитал первый как

Общим родителем MyClass и MyClass будет Object, если это была не наша способность делать подстановочные знаки/подтипы, описанные в следующей ссылке

Ответ 3

Не очень полезно говорить об одном "родительском" параметризованном типе. Важно то, является ли одно супертипом другого. Несомненно, Object является обычным супертипом MyClass<A> и MyClass<B>, а также MyClass<?>. Если A и B являются целыми и числовыми, то MyClass<? extends Number> также является общим супертипом; так что MyClass<? extends Serializable>.