2010-10-26 12 views
5

Dans l'exemple suivant, j'ai 2 constructeurs: un qui prend une chaîne et un qui prend un objet personnalisé. Sur cet objet personnalisé, une méthode "getId()" existe qui renvoie une chaîne. Si je passe null au constructeur, quel constructeur est choisi et pourquoi? Dans mon test, le constructeur String est choisi, mais je ne sais pas si cela sera toujours le cas et pourquoi.Quel constructeur est choisi en passant null?

J'espère que quelqu'un peut me donner un aperçu à ce sujet.

Merci d'avance.

Répondre

12

En faisant cela:

ConstructorTest test = new ConstructorTest(null); 

Le compilateur se plaindra indiquant:

Le constructeur ConstructorTest (anObject) est ambigu.

La machine virtuelle Java ne peut pas choisir le constructeur d'invoquer comme il le fait pas d'informations du type d'argument qui correspond au constructeur (voir: 15.12.2.5 Choosing the Most Specific Method).

Vous pouvez appeler un constructeur spécifique typecasting le paramètre, comme:

ConstructorTest test = new ConstructorTest((String)null); 

ou

ConstructorTest test = new ConstructorTest((AnObject)null); 

Mise à jour: Merci à @OneWorld, le cycle (jusqu'à lien de date à le moment de l'écriture) peut être consulté here.

+0

Vous avez raison, j'ai fait une erreur dans mon test, c'est pourquoi l'erreur du compilateur n'apparaissait pas. –

+0

coulée nulle, qui savait! –

+0

lien est la mort; ( – OneWorld

0

Java utilise le constructeur le plus spécifique, il peut trouver selon les arguments. PS: si vous ajoutez un constructeur (InputStream), le compilateur lancera une erreur à cause de l'ambiguïté - il ne peut pas savoir ce qui est plus spécifique: String ou InputStream, car ils sont dans une hiérarchie de classe différente.

+0

Absolument incorrect. Je vais vous épargner le fardeau de downvoting cette réponse. –

+0

Pourquoi pas? Expliquez s'il vous plait, si vous avez quelque chose à dire. – foret

+0

Voir mon poste .... –

3

Le compilateur génère une erreur.

+0

Vous devriez élaborer plus loin. –

+0

Vous avez raison, j'ai fait une erreur dans mon test, c'est pourquoi l'erreur du compilateur n'apparaissait pas. –