Подстановочный знак и тип границ pameter в Java - PullRequest
0 голосов
/ 28 декабря 2018

Рассмотрим этот случай:

class A {}

class B<T extends A, E extends T> {
    B<?, A> b;
    B<?, ? extends A> b2;
}

Как я понимаю, границы типов в этом случае эффективные верхние границы как T, так и E равны class A.Итак, вопрос: почему javac не принимает класс A в качестве аргумента в объявлении поля b, но принимает wildcard ? extends A в объявлении поля b2?

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Со следующими классами:

class A {}
class C extends A {}
class B<T extends A, E extends T> {}

Думайте об этом так:

E extends T extends A
С B<?,A>, затем T -> ? и E -> A
A extends ? extends A
Где ? может быть любым подклассом A, скажем, C.
A extends C extends A явно недопустим.
Так вот почему это ошибка компиляции.


Примечание для пользователей Eclipse:

Компилятор Eclipse 4.9.0 не согласился с javac 8u и Intellij и не выдал ошибку компиляции для обобщенных аргументов в B<?,A>.Я предполагаю, что это ошибка в компиляторе Eclipse, но я не обращался к JLS, чтобы подтвердить это.

class B<T extends A, E extends T> {
    B<?, A> b; // <-- Eclipse does NOT emit a compile error
    B<?, ? extends A> b2;
}

Об этой предполагаемой ошибке сообщалось здесь .

0 голосов
/ 28 декабря 2018

В вашем объявлении поля b введите T может быть что угодно, что расширяет A.В свою очередь E должен расширяться T, однако вы предоставляете тип A для T.A не будет подклассом чего-то, что является подклассом A.

0 голосов
/ 28 декабря 2018

Ваша декларация неверна.Вы упускаете точку «подстановочных знаков».Они используются для объявления неизвестного свойства.Для B<?, E> b E должен расширять T, а T должен расширять A, но вы сказали, что первый универсальный тип - ?, который неизвестен!Итак, вы сказали, что неизвестный параметр должен быть расширен T и так A.Это неверно.

Отношения, которые вы создали, похожи на E -> T -> A.После этого вы объявили 1. универсальный тип ? -> E -> T -> A и 2. универсальный тип как A -> E -> T -> ?.Так ?должен распространяться?и A должен расширять E против. Это сбивает с толку и неизвестно для компилятора ...

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