2010-08-16 6 views
2

Les gars, pouvait-on donner une explication logique de la phrase que j'ai rencontré dans this book:Pourquoi null a été appelé "un sous-type de chaque type de référence"?

Vous trouverez peut-être utile de penser à ? extends T comme contenant tous les types dans un intervalle délimité par le type de null ci-dessous et par T ci-dessus (où le type de null est un sous-type de chaque type de référence).

Merci.

+0

Bien que n'étant pas la partie que vous posez, je ne suis pas sûr que j'aime l'instruction "intervalle délimité par le type de null ci-dessous et par T ci-dessus" soit. Comme 'null' peut être converti en une référence de type * any *, j'ai l'impression que c'est encore moins" spécifique "que" T ", ce qui rendrait l'intervalle un peu étrange ... Je suppose que je ne fais que pinailler le base de ma propre interprétation (probablement mathématiquement imparfait), cependant. : P –

+0

@Tim: Tim, je suis complètement d'accord avec vous sur cette logique plutôt non intuitive, car dire "être une sous-classe" me fait affaire d'utilisation concrète et pratique + propriétés réelles des hiérarchies de type & trucs OOP ... Voir un article posté par @JRL – Max

Répondre

4

Je pense que cela signifie simplement que vous pouvez assigner la référence nulle à n'importe quel type de référence. Cela ne me semble pas être une façon très utile d'y penser.

La spécification du langage Java a ceci à dire au sujet du type null (en section 4.1):

Il y a aussi un type spécial null, le type de l'hypothèse nulle d'expression, qui a pas de nom. Étant donné que le type null n'a pas de nom , il est impossible de déclarer une variable du type null ou de pour le type null. La référence null est la seule valeur possible d'une expression de type null. La référence null peut toujours être convertie en n'importe quel type de référence . En pratique, le programmeur peut ignorer le type nul et prétendre que null est simplement un littéral spécial pouvant être de n'importe quel type de référence .

+1

donc, la phrase clé ici est 'La référence nulle peut toujours être convertie en n'importe quel type de référence', ce qui fait qu'auhthor prétend que' le type de null est un sous-type de tout type de référence'. Bizarre un :) Merci de l'avoir signalé. – Max

+0

C'est une façon de penser utile dans la mesure où elle vous indique que le système de type de Java est défectueux, ce qui le rend à peu près inutile. –

0

Cela signifie que null peut être de n'importe quel type. Vous pouvez avoir une classe Animal avec une sous-classe Dog. Si vous avez une variable de type Animal avec la valeur null vous ne pouvez pas dire si le null est de type Animal ou de type Dog. Les deux sont également valables.

+0

Je pense que c'est une déclaration légèrement trompeuse. La valeur 'null' a toujours exactement un type - le type' null'. Cela ne peut pas être "n'importe quel type". Le système de type définit le type 'null' (qui est seulement habité par la valeur' null') pour être un sous-type de tous les types de référence. Dans votre exemple, c'est comme si vous aviez une classe implicite 'null' définie comme une sous-classe de 'Animal', et donc il serait valide d'assigner la valeur' null' (une instance de cette classe 'null') à une variable de type 'Animal'. – Gian

-1
null instanceof T 

est vrai pour tout type T.

+0

qu'en est-il de 'System.out.println (null instanceof Object);' donner 'false'? – Max

+0

C'est complètement faux. Les créateurs de Java se sont mis en quatre pour rendre cette affaire toujours fausse –

+0

Je suis embarassé. Je suppose juste! – Ladlestein

2

Types forment un ordre partiel, soit pour deux types dans l'ensemble de tous les types dans le programme, il pourrait y avoir une relation entre eux (T1 < T2 - T2 est un sous-type de T1 dans un certain sens). Les choses dans les hiérarchies de classes non apparentées n'ont pas de telles relations définies.

Donc, fondamentalement, ce que cela vous dit est que tous les membres de l'ensemble des types que décrit ? extends T est inférieur à T et supérieur à null. null existe en tant que sous-type de tout car il est toujours possible d'affecter la valeur null à une référence.

Plus formellement:

∀x ∈ ? extends T. null ≥ x ≥ T 
2

De this interesting article, un extrait:

Java a le type NULL.Pre-JLS3, le type nul n'était pas officiellement le sous-type de tout type, et la référence null n'était pas officiellement une valeur de tout type sauf le type null. Un décret a rendu la référence null convertible en n'importe quel type de référence pour raisons pragmatiques. (Ceci est similaire à le décret qui fait la liste assignable à une liste de paramètres formels même si la liste n'est pas un sous-type de la liste. Vous connaissez le décret que la conversion de capture.) JLS3 définit le type null comme un sous-type de chaque type, donc il semble beaucoup comme en bas.

+0

Appréciez beaucoup votre élaboraton du sujet. Je n'étais pas au courant de ce type de monstre nul. – Max

+0

Si vous connaissez Scala, le type de 'null' de Java est similaire au type Scala' Nothing', qui est un sous-type de tous les types de référence (tous les types qui sont des sous-types de 'AnyRef'). – Jesper