За этот ответ и этот ответ , статические методы Java не являются виртуальными и не могут быть переопределены.Таким образом, интуитивно это должно работать (даже если в 99% случаев это опасное программирование):
class Foo
{
public static String frob() {
return "Foo";
}
}
class Bar extends Foo
{
public static Number frob() {
return 123;
}
}
Однако на практике это дает вам:
Foo.java:10: frob() in Bar cannot override frob() in Foo; attempting to use incompatible return type
found : java.lang.Number
required: java.lang.String
public static Number frob() {
^
Наивно это кажетсякак Foo.frob()
и Bar.frob()
не должны иметь ничего общего друг с другом;все же Java настаивает на том, что они делают.Почему?
(Примечание: я не хочу слышать, почему было бы плохой идеей кодировать таким образом, я хочу услышать, что это за Java и / или дизайн JVM, который делает это ограничение необходимым.)
Обновлено для добавления: Для тех, кто думает, что компилятор может запутаться, вызывая статические методы в экземплярах, если вы разрешите это: это не так.Это уже нужно выяснить в случае, когда сигнатуры методов совместимы с :
class Foo
{
static String frob() {
return "Foo";
}
}
class Bar extends Foo
{
static String frob() {
return "Bar";
}
}
class Qux {
public static void main(String[] args) {
Foo f = new Foo();
Foo b = new Bar();
Bar b2 = new Bar();
System.out.println(f.frob());
System.out.println(b.frob());
System.out.println(b2.frob());
}
}
дает вам:
Foo
Foo
Bar
Вопрос в том, чтоконкретная причина, по которой он не мог так легко (в случае несовместимых подписей) получить вас:
Foo
Foo
123