2013-01-07 3 views
1

J'ai isolé l'erreur sur cette ligne: string.getClass() == jojo.getClass() Cette ligne ne doit-elle pas créer deux objets de classe, puis vérifier si elles (comme dans les deux références) pointent vers le même objet? Plutôt que de renvoyer une valeur false, le code ne sera pas exécuté.Erreur de compilation avec l'opérateur ==

public class Tester 
{ 
    public static void main(String[] args) 
    { 
     OreoJar jojo = new OreoJar(0); 
     OreoJar momo = new OreoJar(1); 
     String string = "Hello"; 

     if (momo.getClass() == jojo.getClass()) 
     { 
      System.out.println("Momo and jojo are of the same class"); 
     } 

     if (string.getClass() == jojo.getClass()) 
     { 
      System.out.println("String and jojo are of the same class"); 
     } 
    } 
} 

public class OreoJar 
{ 
    int oreos; 

    public OreoJar(int oreos) 
    { 
     this.oreos = oreos; 
    } 

    public void count() 
    { 
     System.out.println(oreos + " oreos in this jar!"); 
    } 
} 

Ce commentaire est une sorte de caché et je pense que la peine de mentionner, car il fait le plus de sens à un débutant (comme moi)

-Selon JLS « Il est une erreur de compilation s'il est impossible de convertir le type de l'un ou l'autre opérande au type de l'autre par une conversion de coulée "donc deux références des types A et B peuvent être comparées si, et seulement si, A peut être converti en B ou B peut être cast to A. - Patricia Shanahan

+6

Si vous obtenez une erreur de compilation * * et vous avez besoin notre aide, alors le bon sens vous dit que vous devriez signaler cette erreur ici, non? –

+3

Peut-être que vous devriez nous montrer ce qu'est l'erreur? – OldProgrammer

+1

Rendre 'public OreoJar' à' private class OreoJar', puis réessayer? – Marcus

Répondre

6

Je suis d'accord OP devrait citer l'erreur de compilation.

De toute façon l'erreur de compilation est assez évidente quand quelqu'un fait réellement une compilation.

L'erreur est:

Tester.java:15: incomparable types: java.lang.Class<capture#125 of ? extends java.lang.String> and java.lang.Class<capture#29 of ? extends OreoJar> 
    if (string.getClass() == jojo.getClass()){ 
         ^

Raison semble évidente.

De Javadoc de Object.getClass():

The java.lang.Class object that represents the runtime class of the 
object. The result is of type Class<? extends X> where X is the 
erasure of the static type of the expression on which getClass is 
called. 

Cela signifie, une instance de chaîne va renvoyer une référence à Class<? extends String>, tandis qu'une instance OreoJar va revenir référence à Class<? extends OreoJar>

Les deux types ne sont tout simplement pas compatibles, car le compilateur sait qu'il n'y a aucune chance qu'un type qui étend String puisse être un type étend OreoJar. Donc, la comparaison va provoquer une erreur de compilation.


Un peu hors sujet, mais je crois utile de mentionner, vous avez dit:

Si pas cette ligne créer deux objets de la classe, puis vérifier si elles pointent vers le même objet

Je pense qu'il est préférable d'avoir une meilleure compréhension. Il ne va pas "créer" deux objets de classe . getClass() va vous renvoyer un référence à l'objet Class.Et, il est toujours une référence qui peut pointer vers un objet , non objet qui pointent vers objet (ça sonne bizarre aussi)

+0

Je ne suis pas très familier avec les génériques de Java, surtout en ce qui concerne l'effacement des caractères. Alors, même si votre réponse me semble correcte, elle crée cette question dans mon esprit: quels types * peuvent * être comparés? –

+2

@TheodorosChatzigiannakis Selon le JLS "C'est une erreur de compilation s'il est impossible de convertir le type de l'un ou l'autre opérande au type de l'autre par une conversion de coulée" donc deux références de types A et B peuvent être comparées si, et seulement si, soit A peut être cast en B ou B peut être cast en A. –

+0

Hmmm, cela explique aussi pourquoi vous pouvez utiliser '.getClass()' sans problème quand vous surchargez '.equals()' et vérifiez par rapport à la classe de l'argument: n'importe quelle classe peut être convertie en 'Object', ce qui signifie que vous pouvez comparer' Class 'à' Class '(et je suppose que ce dernier est probablement équivalent à' Class '?) – fge

-1

getClass() renvoie une instance d'une classe. getClass().getName() renvoie une chaîne. La méthode String.equals(otherString) est la méthode correcte pour comparer les chaînes pour l'égalité.

+1

Mais cela provoquerait une erreur * logic *, pas une erreur de * compilation *, à moins que l'affiche originale soit confuse quant à la différence entre ces deux. –

+0

La question indique que l'intention est de vérifier si deux références pointent vers le même objet. == est la bonne façon de le faire. a.equals (b) demande si deux objets possiblement distincts référencés par a et b sont égaux en égalité est défini dans une classe, une question différente. –

+1

Je ne vois pas que l'OP avait l'intention de comparer les chaînes du tout ici. A moins qu'il n'ait mal interprété le javadoc pour '.getClass()'. Mal lu. – fge

3

Je pense que la raison pour laquelle il ne compilera pas est due au fait que Class a un composant générique. Essayez d'utiliser momo.getClass().equals(jojo.getClass()) Et vous pouvez également essayer de comparer les noms canoniques des classes pour un effet similaire: momo.getClass().getCanonicalName().equals(jojo.getClass().getCanonicalName())

Questions connexes