2010-10-13 25 views
0

Les instructions indiquent: Créer une méthode égale qui prend une référence d'objet et renvoie true si l'objet donné est égal à cet objet. * Astuce: Vous aurez besoin « instanceof » et à un casting (Position)Objets Java instanceof

Je:

class Position { 

    private double x,y; 
    private int id; 

public boolean instanceOf(Object a) 
    { 
     boolean isInstance; 
     if ((Position)a instanceof Position) 
      isInstance=true; 
     else 
      isInstance=false; 
     return isInstance; 
    } 

Mais je le fais mal, et je ne sais pas ce que mon problème. Je suis nouveau à des objets donc c'est un peu me confondre ..

+0

Vos instructions ont une touche défectueuse: voir http: // stackoverflow.com/questions/596462/any-reason-to-prefer-getclass-over-instanceof-when-generation-vaut – Raedwald

Répondre

1

Comme c'est une question de devoirs, je ne donnerai pas une réponse détaillée. Vous devez implémenter une méthode equals(), pas une méthode instanceOf(). Je pense que ce lien aide:

L'exemple de code devraient être suffisantes. Demandez à nouveau si vous avez besoin de plus d'indices.

+0

Hmm ok donc la seule chose qui me manque est cette ligne dans leur exemple: Car c = (Car) o; Comment pourrais-je l'implémenter dans mon cas? – Snowman

+0

Ok, votre deuxième lien a aidé. Cependant, je suis confus à propos de cette ligne: si (this == obj) .... qu'est-ce que cela fait exactement, quoi de "ceci" dans ce cas? – Snowman

+0

@fprime: Je pense que vous avez besoin d'un bon livre pour débutants. –

1

Il a clairement dit créer une méthode equals(), et vous l'avez eu ici aussi. Mais même après tout cela, vous avez créé une méthode nommée instanceOf(). Pourquoi?

En outre, vous pouvez obtenir un ClassCastException sur cette ligne, dans le cas où un autre type d'objet est passé.

if ((Position)a instanceof Position) 

Ce qui signifie que, précisément, que vous ne devez jeter le object-Position, après s'être assuré que le object passé est de type Position. Ce qui signifie maintenant qu'il est bon d'aller plus loin avec la comparaison. Si ce n'est pas de type Position en premier lieu, alors pourquoi devriez-vous la peine de le comparer davantage. Parce que ça ne peut jamais être égal. J'espère que vous obtenez mon point.

[modifié pour répondre à la question dans le commentaire]

Eh bien, l'instance réelle devrait être de position de type. Une fois que nous savons qu'il est de type Position en utilisant l'opérateur instanceof, nous savons qu'il est prudent de le convertir en type Position à partir du type Object. Maintenant, la question est de savoir pourquoi nous devons lancer? Parce que initialement l'instance était de type Object, et nous n'étions pas sûrs du type réel. Vous savez peut-être déjà que Java peut affecter n'importe quel type à un type d'objet, car Object est un parent de toutes les classes de Java. Par conséquent, avant d'appliquer instanceof, nous n'étions pas sûrs du type d'instance. Si vous ne le lancez pas, vous ne pourrez jamais accéder à ses propriétés, à savoir x, y et id. Vous pouvez essayer d'accéder à l'un de ces objets sur un objet réel sans le lancer. Vous saurez que vous ne pouvez pas. Par conséquent, vous ne pouvez pas les comparer non plus. J'espère que cela a été clair.

+0

Donc, si c'est de type Position, pourquoi dois-je le convertir en type Position? – Snowman

+0

@fprime: Voir l'addenda. –

0

Même si le Object a est de type Position, il est défini comme Object. Pour accéder aux propriétés de Position a, nous devons jeter Object a à l'aide Position p

Position p = (Position)a;