getDeclaredMethods() e il metodo statico della super classe nascosta
-
28-09-2019 - |
Domanda
Secondo http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29, Class.getDeclaredMethods() dovrebbe includere solo metodi "dichiarati dalla classe".Tuttavia, ottengo risultati piuttosto sorprendenti con il codice di test riportato di seguito:
import java.util.Arrays;
class A {
public static A m1() { return null; }
public static A m2() { return null; }
public static A m3() { return null; }
}
class B extends A {
public static A m1() { return null; }
public static B m2() { return null; }
// public static Object m3() { return null; } won't compile
}
public class Scratch {
public static void main(final String[] args) {
System.out.println(Arrays.asList(B.class.getDeclaredMethods()));
}
}
Alcune cose che mi sembrano piuttosto strane/sorprendenti:
Il compilatore si lamenta del fatto che B.m3() ha un tipo restituito incompatibile con A.m3().Ciò è dettato da JSL 8.4.8.3 (Pagina 225 v3 langspec-3.0.pdf).Ma sono curioso di sapere perché questa restrizione deve essere applicata ai metodi statici.La mia comprensione è che i metodi statici possono essere nascosti e non sovrascritti e che il riferimento viene risolto in fase di compilazione, quindi qual è il ragionamento dietro questa restrizione?
Nell'output sono inclusi due metodi m2().Ciò sembra contraddire l'affermazione secondo cui getDeclaredMethods() restituisce solo i metodi "dichiarati dalla classe" ed "esclude i metodi ereditati".Non vedo A.m2() come "dichiarato da" B.
Nell'output è incluso un m1().Seguendo il punto precedente, se aveva senso lasciare che getDeclaredMethods() restituisse due m2(), perché non restituisce anche due m1()?Dopotutto sono due metodi distinti e uno è nascosto dall'altro.Non vedo alcuna differenza fondamentale tra il caso di m1() e m2() tranne che il tipo restituito è lo stesso nel caso di m1(), ma il tipo restituito, a quanto ho capito, non fa parte della firma del metodo?
Grazie in anticipo!
Soluzione
Vedere http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786
Anche se era stato segnalato contro 1.6.0_12-b04 il 2009-03-11 05:44:57.0 ma Sun lo ha accettato il 2010-07-22 01:25:56.0
in breve:
Sinossi (riflettere) Class.getDeclaredMethods() restituisce metodi ereditati
Categoria java:classes_lang
Segnalato Contro
Stato 3-Accettato, bug
Priorità: 3-Medio
Data di invio 11-MAR-2009
Lavorare in giro N / A
Valutazione Indagherò.
Post-datato : 2010-07-22 01:25:56.0
Altri suggerimenti
Posso confermare che il bug http://bugs.sun.com/ bugdatabase / view_bug.do? bug_id = 6815786 è ancora presente in Oracle Java Windows a 64 bit 1.6.0_35.