Методам Java разрешено указывать параметры типа, которые могут или не могут использоваться для классификации параметров метода. Почему параметры типа учитываются при сопоставлении сигнатур методов (с целью переопределения)? Разве эти неиспользуемые параметры не следует выбросить? Другими словами, почему приведенное ниже не компилируется [в Java 21]?
Код: Выделить всё
public class Foo {
interface Bar {
void egg();
}
class Baz implements Bar {
@Override
public void egg() {}
}
}
Это просто недосмотр разработчиков языка или существует законная причина для ограничения? Комментаторы запросили более практичный пример:
Код: Выделить всё
public class Foo {
interface Bar {
void egg();
}
class Baz implements Bar {
@Override
public void egg() {
// all three of these references are known to be the same type
Blarg blarg = (Blarg) flim();
Blarg first = blarg.first();
Blarg second = blarg.second();
blarg.doStuff(first, second);
}
}
Blarg flim() {
if (System.currentTimeMillis() % 2 == 0) {
return new Blarg();
}
return new Blarg();
}
class Blarg {
Blarg first() {return new Blarg();}
Blarg second() {return new Blarg();}
void doStuff(Blarg blarg1, Blarg blarg2) {}
}
}
Моя проблема в том, что у меня есть группа локальных переменных, типы которых, как известно, имеют некоторую связь. Мол, они все могут быть одного типа. Или известно, что один из них является подтипом или супертипом других. Чтобы выразить эти отношения, мне нужны переменные одноразового типа. Обычно я без проблем объявляю их в сигнатуре метода. У меня возникли проблемы с этим в методе, который переопределяет другой. Конечно, я мог бы обойти проблему, стирая тип или делегируя выполнение отдельному методу. Я просто не понимаю, почему мне это нужно.
Подробнее здесь:
https://stackoverflow.com/questions/784 ... va-methods