Par cette réponse y cette réponse Les méthodes statiques Java ne sont pas virtuelles et ne peuvent pas être remplacées. Intuitivement, cela devrait donc fonctionner (même si, dans 99 % des cas, il s'agit d'une programmation dangereuse) :
class Foo
{
public static String frob() {
return "Foo";
}
}
class Bar extends Foo
{
public static Number frob() {
return 123;
}
}
Toutefois, dans la pratique, cela ne suffit pas :
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() {
^
Naïvement, il semble que Foo.frob()
y Bar.frob()
ne devraient pas avoir de rapport entre eux, mais Java insiste sur le fait qu'ils en ont un. Mais Java insiste sur le fait que c'est le cas. Pourquoi ?
(N.b. : je ne veux pas savoir pourquoi ce serait une mauvaise idée de coder de cette manière, je veux savoir ce qui, dans Java et/ou dans la conception de la JVM, rend cette restriction nécessaire).
Mise à jour pour ajouter : Pour ceux qui pensent que le compilateur va s'embrouiller en appelant des méthodes statiques sur des instances, si vous autorisez cela : il ne le fera pas. Il doit déjà s'en rendre compte dans le cas où les signatures des méthodes sont compatible :
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());
}
}
vous obtient :
Foo
Foo
Bar
La question est de savoir quelle est la raison concrète pour laquelle il ne pourrait pas aussi facilement (dans le cas de signatures incompatibles) vous atteindre :
Foo
Foo
123