Я читаю jls и столкнулся со следующим термином:
return-type-substitutable
фрагмент из JLS
Объявление метода d1 с типом возвращаемого значения R1 можно заменить другим методом d2 с типом возвращаемого значения R2, если верно любое из следующих условий:
Если R1 недействителен, то R2 недействителен.
Если R1 является примитивным типом, то R2 идентичен R1.
Если R1 является ссылочным типом, то верно одно из следующего:
--R1, адаптированный к параметрам типа d2 (§8.4.4), является подтипом R2.
--R1 может быть преобразован в подтип R2 непроверенным преобразованием (§5.1.9).
--d1 не имеет такой же подписи, как d2 (§8.4.2), и R1 = |R2|.
первые два пункта понятно.
можешь уточнить
--R1, адаптированный к параметрам типа d2 (§8.4.4), является подтипом R2.
--R1 может быть преобразован в подтип R2 непроверенным преобразованием (§5.1.9).
--d1 не имеет такой же подписи, как d2 (§8.4.2), и R1 = |R2|.
Благодарность
P.S. для Луиджи Мендосы
interface Foo {
List<String> foo(String arg1, String arg2);
}
class Bar implements Foo {
@Override
public ArrayList<String> foo(String arg1, String arg2) {
//implementation...
return null;
}
public String foo(String arg1, String arg2, String arg3) {
//implementation...
return null;
}
}
это рабочий вариант.
Причина моего вопроса - я хочу понять следующую фразу из jls:
Если объявление метода d1 с типом возвращаемого значения R1 переопределяет или скрывает объявление другого метода d2 с типом возвращаемого значения R2, то d1 должен быть заменяемым по типу возвращаемого значения (§8.4.5) для d2, иначе возникает ошибка времени компиляции.
правило:
If R1 is a reference type then **one of the following** is true:
...
--d1 does not have the same signature as d2 (§8.4.2), and R1 = |R2|.
...
код:
interface Foo {
List<String> foo(String arg1, String arg2);
}
class Bar implements Foo {
@Override
public List<String> anotherName(String arg1, String arg2,Object obj) {
return null;
}
это ошибка компиляции.
R1==R2 ( List<String > == List<String>
)
d1!=d2
Где я нарушил правило?
anotherName
для переопределения, поэтому вы получаете ошибку компилятора. Кроме того, вы говорите, чтоBar
реализуетFoo
, но в классеBar
нет методаpublic List<String> foo(String arg1, String arg2)
(или другого метода, подпись которогоfoo(String arg1, String arg2)
возвращаетList
или подтипList
). - person Luiggi Mendoza   schedule 11.05.2014