IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Quel est le type de l'opérateur null ?


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut Quel est le type de l'opérateur null ?
    Bonjour,
    j'aurais une question totalement inutile, mais rigolote : Quel est le type de l'opérateur null ?
    Par exemple Prenons les fonctions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    f1(String s)
     
    f1(Object s)
     
    f1(Integer s)
    si je fais f1(null).

    Au final quelle fonction sera appellée ?
    J'ai fais plusieurs tests, et j'ai l'impression que ca dépend presque de l'ordre dans le quel ca compile ... De plus, il semble que si je fais f1(null) ou obj = null; f1(obj), le résultat n'est pas le même.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2008
    Messages : 73
    Par défaut
    Bonjour

    Tu arrives à compiler du code qui utilises ton f1(null) ?
    Quel JDK utilises tu?

    Chez moi, avec du java 1.6, ça donne ça :
    The method f1 is ambiguous for the type ...
    Tu le compiles avec quel JDK ?

    Ce qui finalement semble assez logique

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Djobird Voir le message
    j'aurais une question totalement inutile, mais rigolote : Quel est le type de l'opérateur null ?
    La question n'est pas inutile
    Mais null n'est pas un opérateur mais un littéral, et il est du type "null" (qui est compatible avec tous les types)

    Cf : http://java.sun.com/docs/books/jls/t...al.html#3.10.7

    Citation Envoyé par Djobird Voir le message
    Au final quelle fonction sera appellée ?
    Dans ce cas précis il y a une ambiguité et tu devrais avoir une erreur de compilation...

    Citation Envoyé par Djobird Voir le message
    De plus, il semble que si je fais f1(null) ou obj = null; f1(obj), le résultat n'est pas le même.
    C'est possible puisque le type du paramètre a changé


    Je m'explique : Dans ton exemple le code suivant ne devrait pas compiler :
    Le type null étant applicable à tous les types, les trois méthodes sont compatible et le compilateur ne sait pas quel méthode choisir (en fait il hésite surtout entre f1(String) et f1(Integer) - voir plus bas).

    Maintenant ces deux codes fonctionnent et appelleront tous deux f1(Object) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    f1((Object)null);
     
    Object o = null;
    f1(o);
    En effet ici que ce soit via le cast ou l'affectation, tu utilises un type précis et le compilateur n'a plus qu'une seule et unique méthode compatible ce qui règle le problème...



    Maintenant il y a un derniers cas à prendre en compte : lorsque le type des paramètres des différentes méthodes compatibles forme une même hierarchie, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public void f1(Object o);
     
    	public void f1(Number n);
     
    	public void f1(Integer i);
    Integer descend de Number, lui même descend d'Object...

    Dans ce cas précis, le compilateur va toujours prendre la méthode la plus spécifique, ce qui permet d'être sûr d'utiliser f1(Integer) si la variable utilisé est bien déclaré comme Integer...

    Et comme null est compatible avec tous les types, ce sera le plus spécifique qui sera pris, donc ceci appellera f1(Integer) :

    Dans ton exemple le compilateur ne pouvais pas choisir le type le plus spécifique puisque les types String et Integer n'ont aucun lien, d'où l'erreur de compilation.


    a++

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Par défaut
    Oui en effet ca provoque une erreur de compilation. Merci pour cette information en tout cas, c'est bon à savoir ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quel est le type d'un menu déroulant <select>?
    Par Henry9 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/08/2007, 17h22
  2. quel est le type pour une image?
    Par kitiara999 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 06/12/2006, 18h07
  3. [Conception] quel est le type de variable a choisir?
    Par King_T dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/05/2006, 00h27
  4. Quel est le type retourné ?
    Par Rupella dans le forum C
    Réponses: 4
    Dernier message: 30/11/2005, 14h01
  5. [langage] "@$" Quel est ce type de variable?
    Par YanK dans le forum Langage
    Réponses: 4
    Dernier message: 21/04/2005, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo