2016-10-22 6 views
3

Javaの公式文書では、ジェネリックスの章の最後にいくつかの演習があります。私はほとんど解決することができましたが、1つの答えは私には分かりません。あなたは質問と回答hereを見つけることができます。彼らはJava generics excercise - 答えの説明

<T extends Object & Comparable<? super T>> 

を書くなぜ私は

<T extends Comparable<? super T>> 

を書いたとオブジェクトが必要か優れている拡張し、なぜ表示されない問題8.上の答えを理解していません。

+0

ここで、この「トリック」のより多くの議論があります:あなたのコメントについてhttp://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html#FAQ104 –

+0

おかげで、彼らがいました非常に役立ちます!私が理解しているように、Object拡張は必要ではなく、レガシーAPIを破らないために挿入されるだけです。これは多かれ少なかれバグです。だから私のやり方でそれをするのは完全にうまくいくかもしれません... –

+0

@ user1361466それは、おそらくバグではなく、より多くの機能ではありますが、それは私がそれを考える方法です。 )ジェネリックスを追加するとき、言語設計者は以前のリリースのJavaと下位互換性を維持することに決めました。そのため、ジェネリックスと多くの妥協をしました。 –

答えて

1

私はそのことについて二度考えなければなりませんでした。ここではその理由です:

あなたは

<T extends Comparable<? super T>> 

を書いた場合、それはあなたのTComparableを延長しなければならないことを意味します。あなたが望むのは、Comparableを実装することです。

これを実行するには、クラスを拡張して、実装する必要のあるインターフェイスを正確にする必要があります。

特別なクラスは必要ありませんので、Objectを拡張する必要があります。完了すると、実装するインターフェイスを正確に指定できます。

構文:

<T extends ClassToExtend & InterfaceToImplement> 
+0

オブジェクトの拡張子を省略すると、Tはインタフェースである必要はありませんが、私は理解していますが、型です。上記のコメントが示唆しているように、問題は戻り値の型をObjectにする必要があるレガシーコードと互換性があるようですが、ここでは型の消去後にComparableを取得します。 –

+0

'>'の場合、 'T'は*任意の型、インタフェース、クラス、つまり' Comparable'を拡張することができます。 – Bohemian

+0

OK、私はクラスがインターフェイスを拡張することができなかった... Ilは私の答えを更新します。 – SteeveDroz