2016-05-26 9 views
0

<T extends Number & Comparable<T>>T extends Comparable<? extends Number>の違いを誰かが説明できますか?ジェネリックの違いは、<T extends Number&Comparable <T>>であり、TはComparable <? numbers>

これらは私と似ていて、どちらもサブクラスタイプでうまくコンパイルされます。無効な型の引数エラー

以下に示し

Typeパラメータがバインドされたパラメータの範囲内ではありません。 'java.lang.Number型'

を実装する必要がありTypeパラメータは、バインドされた範囲内ではありませんパラメータ。それぞれ、 'java.lang.Comparable>'

にそれぞれ拡張する必要があります。

+1

(...たぶんあります)私はオプション2のために多くの有用なシナリオを考えることはできませんので、オプション1は、あなたが探しているものだと思います。あなたは何のことを言っているのですか?あなたはいつそれを手に入れますか? –

答えて

2

あなたは使用することはできません。

Comparable<? extends Number> 

Comparableによって定義された唯一の方法は、(PECSの意味での)消費者あるので:それはそのcompareToにタイプ? extends Numberのインスタンスを受け入れる必要がありますメソッドを呼び出すことができます。

Integerは、Comparable<? extends Number>ですが、Doubleです。したがって、Integer.compareToIntegerパラメータしか受け入れることができないため、これらのインスタンスが具体的にはそれぞれIntegerDoubleの場合に失敗するため、instance1.compareTo(instance2)を安全に呼び出すことはできません。

このように、コンパイラは、最初にこのメソッドを呼び出さないようにします。

+0

タイプがないと言ったら何を意味しますか? Integerクラスはバインディングを満たす型ではありませんか? – Veeram

+0

@ ShivV:彼は、 'T'型の値は' .compareTo() 'に何もできないことを意味します。 – newacct

+0

@ ShivV私の答えを編集して、詳しい説明を追加しました。 –

1

オプション1:

public class A <T extends Number & Comparable<T>>{} 

はあなたの一般的なパラメータは、番号を拡張する必要がありますし、は、クラスAの数と同等であることを意味し をComparableを実装しています。

オプション2:

public class B <T extends Comparable<? extends Number>>{} 

T番号に匹敵するものである(数だけを比較することができます)が、数にする必要はありません、とは異なり、オプション1

私が説明します例によって:

public class A <T extends Number & Comparable<T>>{} 

B

public class B <T extends Comparable<? extends Number>>{} 

IntegerWrapper(オプション2)

public class IntegerWrapper implements Comparable<Integer> { 

     Integer number; 

     public IntegerWrapper(int number) { 
     this.number = number; 
     } 

     @Override 
     public int compareTo(Integer o) { 
     return number.compareTo(o); 
     } 
    } 

GenericsTest パブリッククラスGenericsTest {

public static void main(String args[]){ 
    A myA = new A<Integer>(); 

    B myB = new B<IntegerWrapper>(); 
    } 
} 

私はあなたのコードを表示

+0

"Tは数字で比較可能です(数字だけを比較することはできますが、数字である必要はありません)"もう少し詳しく説明できますか? – Veeram

+1

TはNumber型ではComparableですが、オプション1〜> T extends NumberのようにNumberクラスを拡張する必要はありません。唯一のComparable です。 T extends Numberと定義した。私の例ではIntegerWrapperはNumberクラスを拡張していませんが、Comparable

関連する問題