10

たとえば、次のコードは、2番目のオブジェクトがTreeSetに追加されると、ClassCastExceptionをスローします。タイプパラメータが比較可能なタイプのみになるようにTreeSetを記述できませんでしたか?つまり、ObjectがComparableでないため、TreeSetはコンパイルされません。そうすれば、ジェネリックは実際にその仕事をします-タイプセーフであるということです。

import java.util.TreeSet;
public class TreeSetTest {
  public static void main(String [] args) {
   TreeSet<Object> t = new TreeSet<Object>();
   t.add(new Object());
   t.add(new Object());
  }
}
4

4 に答える 4

13

TreeSet非値を比較するComparableために外部をとることができるため、typeパラメーターがである必要はありません。ComparatorComparable

于 2010-04-13T19:06:07.120 に答える
5

タイプがComparableである必要がある場合、比較できないタイプとComparator(現在のように作成できます)を使用してTreeSetを作成することはできません。

タイプセーフでありながらこれを修正する1つの方法は、2つのクラスを持つことでした。1つは比較可能なタイプパラメーターを持ち、もう1つは比較不可能なタイプパラメーターを持ち、デフォルトコンストラクター(コンパレーターをとるコンストラクターのみ)を持ちます。 Java開発者が基本的に同じことを行う2つのクラスを導入したくないと仮定します(ただし、一方は他方のラッパーとして簡単に実装できます)。

別の(そして間違いなくよりクリーンな方法)は、特定のコンストラクターが特定の型パラメーターで使用された場合にのみ存在するように型システムを拡張することです(つまり、デフォルトのコンストラクターは、型パラメーターが同等である場合にのみ存在します)が、それによって汎用が作成されたと思いますシステムが複雑すぎてJavaには対応できません。

于 2010-04-13T19:06:12.050 に答える
1

これは、値が必ずしも実装する必要がないComparableためです。セットにオブジェクトを明示的に渡すことができますComparator。その場合、要素タイプはである必要はありませんComparable

于 2010-04-13T19:06:53.697 に答える
0

コンストラクターパラメーターとしてを使用しTreeSetてを作成することもできます。Comparatorそうすれば、あなたのアイテムは比較可能である必要はありません。

于 2010-04-13T19:07:48.510 に答える