Почему класс java.lang.reflect.WildcardType возвращает массивы для верхней и нижней границ? - PullRequest
0 голосов
/ 01 октября 2018

В последнее время я много читал о Java Generics, так как собираюсь начать проект, который сильно зависит от этих механизмов и общедоступного API отражения, позволяющего получить к ним доступ.Но в моем понимании это немного противоречит:

Обратите внимание, что подстановочный знак может иметь только одну границу.Он не может иметь ни верхней, ни нижней границ, ни нескольких верхних или нижних границ.Такие конструкции, как «? Super Long extends Number» или «? Extends Comparable & Cloneable», являются недопустимыми.

(http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ102; раздел Wildcard Bounds)

Таким образом, aподстановочный знак всегда имеет только одну границу (если вы игнорируете верхнюю границу «Объект», которая идет с каждым подстановочным знаком нижней границы).Но если вы посмотрите на соответствующий класс API отражения WildcardType, кажется, что это не вся правда:

Почему API предоставляет только функции getLowerBounds() и getLowerBounds() а почему они возвращают массив?Есть ли сценарий, при котором будет возвращен массив длиной не менее двух?

1 Ответ

0 голосов
/ 01 октября 2018

Доступные мне источники (1.8.0_172) содержат этот «внутренний» комментарий:

// one or many? Up to language spec; currently only one, but this API
// allows for generalization.

Таким образом, создается впечатление, что API предназначен для случая, когда вбудущее.

Редактировать:

Вот ссылка на источники 1.8.0_181 , которая показывает, что этот комментарий все еще присутствует.( Вот та же ссылка для OpenJDK 10.0.2 )

Почему это обобщение, даже если оно не нужно?Предположим, что вы позже измените API, и весь существующий код нужно будет изменить с Type на Type[]. Нам нужно будет добавить новые методы, что затруднит объяснение, почему существует два метода.

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