2010-10-28 9 views

Répondre

18

Parce que String.valueOf(null) sélectionne la méthode surchargée avec l'argument char[], puis échoue dans le constructeur new String(null). Ce choix est fait au moment de la compilation.

Si vous souhaitez utiliser explicitement la méthode surchargée avec un argument Object, utilisez:

String.valueOf((Object) null) 

Notez qu'il n'y a pas de méthode surchargée prenant un argument String - celui invoqué dans le premier cas prend Object.

Pour citer le JLS:

15.12.2 étape de compilation 2: Déterminer le mode Signature

La deuxième étape recherches sur le type déterminé à l'étape précédente pour les méthodes membres. Cette étape utilise le nom de la méthode et les types des expressions d'argument pour localiser les méthodes qui sont à la fois accessibles et applicables, c'est-à-dire les déclarations qui peuvent être correctement appelées sur les arguments donnés. Il peut y avoir plus d'une telle méthode, auquel cas la méthode la plus spécifique est choisie. Le descripteur (signature plus type de retour) de la méthode la plus spécifique est celui utilisé lors de l'exécution pour effectuer l'envoi de la méthode.

Toutes les méthodes sont applicables, donc nous allons à:

15.12.2.5 Le choix de la méthode la plus spécifique

Si plus d'une méthode membre est à la fois accessible et applicable à une invocation de méthode, il est nécessaire d'en choisir une pour fournir le descripteur de la répartition de la méthode d'exécution. Le langage de programmation Java utilise la règle selon laquelle la méthode la plus spécifique est choisie. L'intuition informelle est qu'une méthode est plus spécifique qu'une autre si l'invocation gérée par la première méthode pouvait être transmise à l'autre sans une erreur de type à la compilation.

Merci à polygenelubricants - il n'y a que deux méthodes surchargées d'accepter un objet - char[] et Object-char[] est le plus spécifique.

+0

null doit être considéré comme un objet. pourquoi il le considère comme char []? – Sujith

+3

@Sujith: Parce que 'char []' * est * un objet – skaffman

+0

@Sujith utilisez-vous eclipse, ou javac? – Bozho

Questions connexes