JRL ha scritto:
No non lo è, ...
Come spesso, dipende da dove lo guardi, a chi credi di più.
Secondo il JLS, sì, lo è . Soprattutto se riformuli la domanda in: "Il testo è nullletterale Object?". Oltre a JLS 4.1 citato da Michael Borgwardt sopra:
Vedere JLS 3.10.7 :
Un valore letterale null è sempre di tipo null.
e JLS 4.10 :
I sottotipi di un tipo T sono tutti i tipi U tali che T è un supertipo di U e il tipo null.
o JLS 4.10.2 :
I supertipi diretti del tipo null sono tutti tipi di riferimento diversi dal tipo null stesso.
[Sottolinea da me.]
Secondo il compilatore di Eclipse 2019-09 non è :
true.toString(); // Cannot invoke toString() on the primitive type boolean
null.toString(); // Cannot invoke toString() on the primitive type null
Secondo OpenJDKs 12.0.1 javac è :
true.toString(); // error: boolean cannot be dereferenced
null.toString(); // error: <null> cannot be dereferenced
Dove le parentesi angolari implicano che nullè di tipo diverso da quello primitivo. E secondo JLS 4.1 :
Esistono due tipi di tipi nel linguaggio di programmazione Java: tipi primitivi (...) e tipi di riferimento (...).
se non è l'uno è l'altro.
Claudiu ha scritto:
null è un po 'brutto.
Au contraire, nullè bellissimo. Cosa suggeriresti invece come valore predefinito per una variabile del tipo di riferimento? Una combinazione di bit arbitraria? Benvenuto alla violazione di accesso o, peggio ancora, all'inferno del puntatore!
Joachim Sauer ha scritto:
null è un tipo e un valore.
In realtà ci sono tre elementi in combinazione con null (vedere anche JLS 3.10.7 ):
- Il tipo null (altrimenti senza nome) .
- Il
null letterale .
- Il valore di riferimento nullo . (Comunemente abbreviato come valore nullo o semplicemente nullo .)
(1) Si noti che, secondo JLS 4.10.2 sopra citato, il tipo null utilizza l'ereditarietà multipla non solo per le interfacce ma anche per le classi. Ciò che tutti sappiamo non è possibile per noi programmatori di applicazioni.
(2) Il letterale nullo potrebbe essere immaginato come una variabile definita come:
JVM_global final null_type null = new null_type();
Nota anche JLS 3.9 :
A volte si presume, erroneamente, che una varietà di sequenze di caratteri siano parole chiave:
nullnon è una parola chiave, ma piuttosto il letterale nullo ( §3.10.7 ).
circa null instanceof <any type>
Con JLS 4.10.2 in mente ("il tipo nullo è un sottotipo di ogni tipo") null instanceof <any type>dovrebbe essere valutato true, no? A prima vista, sì, ma JLS 15.20.2 dà la risposta insight:
[...] il risultato del instanceofgestore è truese il valore del RelationalExpression non ènull [...]. Altrimenti il risultato èfalse .
[Sottolinea da me.]
Chiediti cosa ha più senso (dal punto di vista di un programmatore di applicazioni):
Dare falsee quindi indicare che un'espressione di riferimento non è di un tipo a noi esposto, ovvero indicare che non fa riferimento a nulla di utile per noi
o dando true, informandoci così che l'espressione valuta un riferimento speciale, il riferimento nullo , che fa riferimento a un "oggetto" di cui non sappiamo nemmeno se esiste e che è del tipo speciale nullo che non ha nome, non è esposto a us ma tramite il letterale null , è un sottotipo di qualsiasi tipo inclusa l'ereditarietà multipla e deve essere ignorato comunque? Considera anche l'esempio più pratico:
class Car implements Vehicle {
...
Vehicle car = null;
...
boolean b = car instanceof Car; // True? There's not even an instance
... // which could be of type Car.
Il che porta anche a:
Perché instanceofnon è un modo corretto per dire qualcosa in meritonull sull'Oggetto di?
Si chiama instanceofno sameorsubtypeof. Ciò significa che stiamo confrontando il tipo di un'istanza con un tipo, non due tipi. Ora nullsignifica: "Non c'è nessuna istanza" e se non c'è nessuna istanza non c'è il tipo di istanza. È ovvio che il confronto tra nulla e qualcosa dovrebbe portare a false.
O in un esempio "più" del mondo reale:
- Ho tra le mani un'immagine a grandezza naturale di una mela ( = tipo di riferimento ) con scritto »Big Apple« ( = nome del tipo di riferimento ).
- C'è un tavolo ( = mucchio ) davanti a me.
- Se c'è una mela ( = istanza ) sul tavolo c'è una corda ( = riferimento ) collegata ad essa.
- Tengo l'altra estremità di questo cavo in mano ( = variabile di riferimento ).
- Traccio la mela lungo il cordone e la confronto con la mia immagine ( = istanza di ).
- Se la mela è della stessa dimensione o più grande dell'immagine, si applica la scritta "Big Apple" ( = vero ).
- Se è più piccolo, allora no ( = false ).
- Se non c'è una mela sul tavolo (= nessuna istanza ) e, quindi, non esiste alcun cavo ( = null ) la scrittura non si applica neanche ( = falso ). Perché: nessuna mela è una grande mela? No non lo è.
Come Michael riassume: "null è speciale" davvero.