Тип результата переопределения списка в Java - PullRequest
3 голосов
/ 10 сентября 2010

Я бы хотел, чтобы какой-то вариант этого кода компилировался в Java.

class X
{
    List<X> getvalue(){...};
}

class Y extends X
{
    List<Y> getvalue(){...};
}

Javac (1.6) возвращает ошибку, потому что List и List не совместимы.

Дело в том, что я хотел бы, чтобы компилятор признать, что List совместимый возврат введите в список , если Y является подтипом X. Причина, по которой я хочу это, состоит в том, чтобы упростить использование пользовательского фабричного класса.

Примечание: этот вопрос чем-то напоминает этот вопрос но для Java.

Ответы [ 2 ]

7 голосов
/ 11 сентября 2010

В Java тип возвращаемого значения метода переопределения должен быть ковариантным с типом возвращаемого метода.

Класс java.util.List не является ковариантным (на самом деле, ни один класс Java не является. Это происходит из-за отсутствия аннотаций на сайте объявлений). Другими словами, B <: A не означает List<B> <: List<A> (читается <: как is-subtype-of). Следовательно, ваш код не проверяется.


В Java у вас есть разница в определении сайта. Поэтому следующие проверки типов:

import java.util.List;

class X {
  List<? extends X> getvalue() { return null; }
}

class Y extends X {
  List<Y> getvalue() { return null; }
}
6 голосов
/ 10 сентября 2010

Нет, это не совместимый тип.Вы не можете конвертировать из List<Y> в List<X> только потому, что Y является подклассом X.Обратите внимание:

List<Banana> bananas = new ArrayList<Banana>();
List<Fruit> fruit = bananas;
fruit.add(new Apple());
Banana banana = fruit.get(0); // But it's an apple!

Вы можете использовать ограниченные символы подстановки в Java для выражения ограниченной дисперсии, давая что-то, что является действительным:

List<? extends Fruit> fruit = bananas;

, потому что это помешает вам (во время компиляции) от попыток добавить какой-либо дополнительный фрукт - компилятор знает, что он может быть недействительным.

Я бы порекомендовал FAQ по универсальным Java-приложениям Анджелики Лангер для дальнейшего чтения о подобных вещах.

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