2015-11-05 11 views
15

Ho scritto questa riga di codice in mars Eclipse per scopi che pasticciano:Perché eclipse dice che null è un tipo primitivo?

null.toString(); 

ed ho ottenuto il seguente messaggio di errore del compilatore:

non può invocare toString() sul tipo primitivo nulla

Il che è molto strano poiché null non è un tipo primitivo né un riferimento a un oggetto come spiegato qui: Is null an Object?

Così, tanto per essere sicuro, ho provato a compilare tale linea dispari di codice utilizzando javac e ho ottenuto questo risultato:

NullTest.java:3: non può essere dereferenziati

null.toString(); 
    ^ 

1 errore

Qualcuno sa perché Eclipse fornirebbe un messaggio di errore del compilatore ingannevole (IMO)?

+0

Ottengo lo stesso messaggio di errore "primitivo" anche in Kepler e Luna, quindi non è una novità. – azurefrog

+2

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

+0

[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

risposta

5

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.

+0

Penso che questo sia qualcosa che Scala ha fatto bene. La classe Option. Contiene nulla o qualcosa o valido. – Totoro

+0

@Totoro se si fa riferimento a ['Opzione'] (http://www.scala-lang.org/api/current/index.html#scala.Option), beh, c'è un tipo simile chiamato [' Opzionale'] (https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html). –

+0

Questa spiegazione sembra più interessante e convincente per me. Almeno, mi fa pensare che i ragazzi di Eclipse * abbiano dimenticato * che esiste un tipo nullo e si presume che se la variabile non è un riferimento, allora è un primitivo e lascia che sia. Insetti o ipotesi come questa accadono anche nelle squadre più esperte. –

-2

Non c'è motivo.

Solitamente eclissi analizza il bytecode e per qualche motivo null.toString() sono due istruzioni bytecode, una definizione e una chiamata. Poiché è possibile chiamare toString solo sugli oggetti, eclipse presuppone che la dichiarazione debba dichiarare una primitiva.

È possibile scrivere un Bugreport ma pensare al sovraccarico che potrebbe derivare dall'internazionalizzazione del messaggio di errore.

+2

Se parli di internazionalizzazione del messaggio di errore, devo dire che stanno fornendo un messaggio di errore fuorviante in diverse lingue, non solo in inglese! –

+0

Ma è un nuovo messaggio che non esiste in nessun altro linguaggio fino ad ora. Il suo lavoro scutorio vs non scientifico. –

+0

Eclipse non analizza il bytecode: è un suo compilatore che analizza il codice sorgente creando l'AST, quindi * produce * il bytecode. Quindi la tua risposta è fuorviante. –

Problemi correlati