2016-12-06 6 views
-1

ジェネリックコレクションでは、同じタイプのオブジェクトを使用できます。したがって、等しいメソッドをオーバーライドする場合は、同じタイプのオブジェクトをチェックするためにgetClassを使用する必要があります。ジェネリック型コレクションでは、オーバーライドされた等価メソッドでgetClassをチェックする必要がありますか?

私の質問は(obj.getClass()!=this.getClass())です。このコードは、コレクションの汎用タイプとして使用されるクラスと同じメソッドで必要ですか。 私たちは汎用型のコレクションを知っている、我々はは同じ種類のオブジェクトを追加することができます。したがって、等価メソッドからこのコードを削除すると、問題はありますか?

@Override 
    public boolean equals(Object obj) { 
     if(obj==null){ 
      return false; 
     } 
     if(this == obj){ 
      return true; 
     } 
     Student std = (Student)obj; 
     return name.equals(std.name) && rollNum == std.rollNum; 
    } 

の新オーバーライド同じ方法で、我々は一般的なコレクションでこのクラスを使用している場合、私の質問は、我々は同じ方法で使用するのはgetClass()を必要とするんですが、私は、そのコード行が関連はないと思います一般的なオブジェクトの追加異なるタイプに許可されませんので、

import java.util.*; 
public class HashSetDemo { 
    public static void main(String [] args){ 
      HashSet<Student> hashSet = new HashSet<Student>(); 
      hashSet.clear(); 
      Student std1 = new Student(11, "qaa"); 
      Student std2 = new Student(21, "aa"); 
      Student std3 = new Student(31, "saa"); 
      Student std4 = new Student(51, "aad"); 
      Student std5 = new Student(71, "aad"); 
      hashSet.add(std1); 
      hashSet.add(std2); 
      hashSet.add(std3); 
      hashSet.add(std4); 
      hashSet.add(std5); 
    } 
} 

class Student{ 
    int rollNum; 
    String name; 
    public Student(int rollNum, String name){ 
     this.rollNum = rollNum; 
     this.name = name; 
    } 

    @Override 
    public int hashCode() { 
     //some code 
    } 
    @Override 
    public boolean equals(Object obj) { 
     if(this == obj){ 
      return true; 
     } 
     if(obj == null || (obj.getClass()!=this.getClass())){ 
      return false; 
     } 
     Student std = (Student)obj; 
     return name.equals(std.name) && rollNum == std.rollNum; 
    } 
} 
+0

「Student」のサブクラスを持ち、そのサブクラスのインスタンスをベースクラスのインスタンスと同じにするには、 'instanceof'を使用します。そうでなければ、 'getClass()'を使用します。これは、誤って非対称な 'equals'メソッドで終わってしまうのを防ぐためです(例えば、[java.sql.Timestamp](https://docs.oracle.com/javase/7/docs/api/ java/sql/Timestamp.html#equals(java.lang.Object)))。あなたが一般的なコレクションに入れているという事実は、実際問題ではありません。 – khelwood

+0

あなたの質問が「タイプを一切チェックすべきか? '' equals'メソッドが['equals']の通常の規約に従う必要があるためです(https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java .lang.Object))、これは他の型のオブジェクトを与えるとfalseを返します( 'ClassCastException'をスローしません)。 – khelwood

+0

@khelwoodコメントありがとうございました。私はinstanceof演算子を削除しました。今、答えを教えてください。 – Guest

答えて

2

Khelwoodが提供するコメントに同意し、また、我々はそれができるチェックヌルと&&条件で検証されている||objがある場合理由nullの場合、NullpointerExceptionが発生します。

if(obj == null || (obj.getClass()!=this.getClass())){ 
     return false; 
    } 
+0

これは欠けていたので、質問を更新して答えを更新しました... – Guest

+0

クールなので、 'instanceof'の代わりにgetClass()を使って確認してみると、lexicore、' student.equals(masterStudent )== trueとmasterStudent.equals(student)== false' – snofty

0

@khelwoodはrigthです。そして、あなたのコード内で「場合は、」間違っている:

if(obj == null && (obj.getClass()!=this.getClass())){ 
     return false; 
    } 

それが何をするか:objがnullの場合は、次のobj.getClassでNPEを取得します()。 nullにはクラスがありません。 :-)

if (!(obj instanceof Student)) { return false;} 

で十分です。 nullはどのクラスのインスタンスでもありません。

3

equalsは、一貫性のある対称、推移、再帰可能とnullためfalseを返さなければなりません。

obj instanceof Studentの問題は対称です。 MasterStudent extends Studentがあり、 "instanceof CurrentClassのパターンに従ってCurrentClassのフィールドを比較する"と仮定します。これはStudentに実装されているのと同じです。この場合、簡単にstudent.equals(masterStudent) == truemasterStudent.equals(student) == falseが得られます。

あなたは、あなたの質問を編集し、この部分を削除しました:

ジェネリックコレクション、同じメソッドをオーバーライドしながら、我々はサブクラスをチェックするためのinstanceofかのgetClassを使用する必要がないので、オブジェクトの同じタイプを許可または同じ種類のオブジェクト。

基本的には、クラスがequalsであることを確認する必要があるかどうかを尋ねるだけで、そのタイプがコレクションによって保証されることを示唆しています。

短い回答はもちろんです。equalsでクラスをチェックする必要があります。使用可能な用途に関係なくequalsを実装する必要があります。

+0

私はinstanceCl演算子を使用していません。getClassだけを使用し、Plzが答えを返します。 – Guest

+0

@Guestまあ、あなたはあなたの質問を編集しました。同じタイプのオブジェクトを許可するので、等しいメソッドをオーバーライドしている間に、サブクラスまたは同じタイプのオブジェクトをチェックするためにinstanceofまたはgetClassを使用する必要があります。 – lexicore

+0

はい、正確な回答が得られなかったので、質問を更新しました。私の質問は、ジェネリックコレクションでこのクラスを使用している場合は、等価メソッドでgeClassを使用する必要があります。ジェネリックは異なるタイプのオブジェクトを追加できないため、コード行は関係ありません。 – Guest

関連する問題