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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top