2016-06-15 22 views
0

私はJavaでライブラリ管理アプリケーションを構築しています。抽象関数、パラメータ型はクラスを拡張します

私はMaterialという抽象クラスを持っています。それはequalsと呼ばれる抽象メソッドを持っています。

Newspaperと呼ばれるサブクラスであるとequalsは内部Materialているとして、それは当然のことながら、まったく同じシグネチャを持つ、equalsを実装します。

public <T extends Material> boolean equals(Class<T> elementoAComparar) { 
    if (this.getTitulo().equals(elementoAComparar.getTitulo()) && this.getFechaPublicacion().equals(elementoAComparar.getFechaPublicacion())) { 
     return true; 
    } else { 
     return false; 
    } 
} 

JavaはelementoACompararの方法のうちのいずれかを解決することはできません。それらはすべてNewspaperに存在し、Materialを拡張します。

私は助けを得ましたon this thread of SOしかし、私はそれが本当に動作するようにすることはできません。

私が実際には得られないのは、ジェネリックパラメータとして動作しているクラスのメソッドを使用する方法です。

私は、これは難しいことではありません本当に確信しているが、私は、Javaには本当に少しの経験を持って、私に硬くなりすぎないようにしてください:)

ありがとう!

+0

なぜあなたの 'equals'メソッドは引数としてクラスを取るのですか? – khelwood

+0

私は自分が何をしているのか理解できていないことを証明します。 今私は実際に何をしているのか理解していますが、私がしたことはまだ分かりません。私は本当に "クラス"の意味を持っていません。 – DavidVV

答えて

1

@Ajit Georgeが述べたように、等価メソッドを実装しようとしている場合、より洗練された方法があります。ただし、コードをコンパイルして実行するだけの場合は、メソッドのシグネチャを変更する必要があります。 JavaはelementoACompararのメソッドを解決できません。Classにはこれらのメソッドがないため、Materialがあります。

あなたのequalsメソッドシグネチャを変更する必要があります

から
public <T extends Material> boolean equals(Class<T> elementoAComparar) 

public <T extends Material> boolean equals(T elementoAComparar) 

への最初の署名はあなたが Classオブジェクトのインスタンスを渡すされるJavaを伝えます。 2番目のクラスは、オブジェクトのインスタンス( Material)を渡すことをJavaに通知します。

+0

私はそれを得た。あなたが私に言ったように署名を変更し、Material to Periodico(スペイン語の新聞)をキャストしたので、実際にはすべてのメソッドにアクセスできます(getFechaPublicacionはMaterialではありません)。 – DavidVV

0

2点:

  • Classオブジェクトは、オブジェクト・クラスを表し、equalsは、典型的には、インスタンスを比較するために使用されます。 equals宣言は、このオブジェクトとクラスオブジェクトを比較することを意味します。
  • equalsは、すべてのオブジェクトが継承するjava.lang.Objectで定義されています。 Javaライブラリコードで比較実装を使用するには、Object.equalsを上書きする必要があります。 equalsはJavaのジェネリックに先立っているため、Object.equalsはそれらを使用していません。実装では、比較対象のインスタンスをチェックして、オブジェクトタイプにキャストして、他のオブジェクトのフィールドを取得する必要があります。

答えはWhat issues should be considered when overriding equals and hashCode in Java?で、良い要約とデモンストレーションが得られます。

+0

あなたは正しいです、私もそれを私のオブジェクトにキャストする必要がありました。さもなければ私はすべての方法にアクセスすることができません。ありがとうございました。 – DavidVV

関連する問題