Per this answer e this answer, i metodi statici Java non sono virtuali e non possono essere sovrascritti. Intuitivamente, quindi, questo dovrebbe funzionare (anche se nel 99% dei casi si tratta di programmazione pericoloso):Perché Java impone la compatibilità del tipo restituito per i metodi statici sottoposti a override?
class Foo
{
public static String frob() {
return "Foo";
}
}
class Bar extends Foo
{
public static Number frob() {
return 123;
}
}
Tuttavia, in pratica, questo si ottiene:
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, sembra che Foo.frob()
e Bar.frob()
non dovrebbe avere nulla a che fare l'uno con l'altro; ma Java insiste che lo facciano. Perché?
(Nb:. Non voglio sentire perché sarebbe una cattiva idea per codificare in questo modo, voglio sentire che cosa è in Java e/o la progettazione JVM che rende questa restrizione necessario)
aggiornato per aggiungere: per coloro che pensano che il compilatore sta per confondersi chiamando metodi statici sulle istanze, se si consente questo: non lo farà. Ha già di capire questo nel caso in cui il metodo firme sono compatibili:
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());
}
}
si ottiene:
Foo
Foo
Bar
La domanda è: qual è la ragione concreta per cui non poteva come facilmente (nel caso incompatibili firme) ottenere:
Foo
Foo
123
Woah, amico, amico. – Tom
Non sono sicuro che questa sia stata necessariamente la migliore decisione possibile - ha portato a disagio come [questo codice in Guava] (http://code.google.com/p/guava-libraries/source/browse/guava/ src/com/google/common/collect/ImmutableSortedSetFauxverideShim.java) - ma non è una decisione irragionevole, e presumo che abbiano avuto ragioni per questa chiamata al giudizio che non ho ancora pensato. –
'myB' chiamerà il' doThing() 'di tipo' myB'. –