Por this answer y this answer, los métodos estáticos de Java no son virtuales y no pueden anularse. Intuitivamente, por lo tanto, esto debería funcionar (aunque en el 99% de los casos es la programación peligroso):¿Por qué Java exige la compatibilidad del tipo de devolución para los métodos estáticos anulados?
class Foo
{
public static String frob() {
return "Foo";
}
}
class Bar extends Foo
{
public static Number frob() {
return 123;
}
}
Sin embargo, en la práctica esto se obtiene:
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() {
^
Ingenuamente, parece que Foo.frob()
y Bar.frob()
no deberían tener nada que ver el uno con el otro; sin embargo, Java insiste en que lo hagan. ¿Por qué?
(Nota:. No quiero saber por qué sería una mala idea para codificar esta manera, quiero oír lo que es en Java y/o el diseño JVM que hace que esta restricción es necesario)
actualizado para añadir: para aquellos que piensan que el compilador va a confundirse con la llamada a métodos estáticos en los casos, si usted permite esto: no lo hará. Ya se tiene que resolver esto en el caso en que las firmas de los métodos son compatibles:
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());
}
}
se obtiene:
Foo
Foo
Bar
La pregunta es, ¿cuál es la razón concreta por la que no pudo mientras fácilmente (en el caso incompatibles firmas) conseguir que:
Foo
Foo
123
Woah, amigo, hombre. – Tom
No estoy seguro de que esta haya sido necesariamente la mejor decisión posible: dio lugar a torpezas como [este código en Guava] (http://code.google.com/p/guava-libraries/source/browse/guava/ src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java) - pero no es una decisión irracional, y supongo que tenían razones para esta decisión que yo todavía no había pensado. –
'myB' llamará a' doThing() 'fuera del tipo' myB'. –