Poiché il null-tipo è un subtype di Object
, è concepibile OK per richiamare Object
metodi su null
.
Tuttavia, seguendo tale logica, poiché il tipo nullo è un sottotipo di ogni tipo di riferimento, dovremmo poter richiamare qualsiasi metodo di qualsiasi classe/interfaccia su null
. Sarà un casino.
Sintatticamente, null.toString()
dovrebbe essere recognized come invocazione espressione metodo a prima, perché null
è un'espressione Primary
. Quindi, per determinare la classe/interfaccia per la ricerca per il metodo toString
, JLS says
... La classe o interfaccia per la ricerca è T se T è un tipo di classe o interfaccia, o il limite superiore di T, se T è una variabile di tipo
È un errore in fase di compilazione se T non è un tipo di riferimento.
T
è il tipo null qui; non è un tipo di classe, un tipo di interfaccia o una variabile di tipo, quindi questo passaggio dovrebbe fallire. Tuttavia, fallisce perché T non è un tipo di riferimento?
Il tipo null è un tipo di riferimento?JLS says
I tipi ... sono suddivisi in due categorie: i tipi primitivi e tipi di riferimento
I tipi numerici sono ....
Il riferimento tipi sono tipi di classe, tipi di interfaccia, [tipo variabili,] e tipi di array. [periodo!]
C'è anche uno speciale tipo Null.
A seconda del parsing del testo, il tipo di null può o non può essere un tipo di riferimento. Di solito non è molto importante; è solo una questione di categorizzazione. Ma porta a confusioni, per esempio in questo caso - l'errore è perché T
non è un tipo di riferimento "corretto" e il compilatore deduce per errore che deve essere un tipo primitivo.
Ottengo lo stesso messaggio di errore "primitivo" anche in Kepler e Luna, quindi non è una novità. – azurefrog
Sembra un errore nel percorso di valutazione in ECJ. Presenta un bug su di esso, che ignoreranno fino a quando Java non verrà sostituito da un'altra lingua. – chrylis
[Sì, anche a me sembra un insetto.] (Http://grepcode.com/file/repository.grepcode.com/java/eclipse.org/4.2/org.eclipse.jdt/ui/3.8.0 /org/eclipse/jdt/internal/corext/refactoring/typeconstraints/types/TypeEnvironment.java#TypeEnvironment.0NULL) È in giro da un po 'di tempo. – Makoto