は、次のコードを考えてみましょう:Javaでは、同じ型のコレクションは空になりますが、異なる型パラメータは常に等しくなりますか?
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
assertThat(list1.equals(list2), is(true));
アサーションが成功します。
確かに、私の知る限り理解し、そこequals
方法は、この2つを区別するための、Javaの方法は、型消去(すなわち実際の型引数は、実行時のために、原因ではありませんString
とInteger
しかアクセスできますコンパイル時には実行時には実行されません)。 そして、比較できる要素がないので、equals
はtrueを返す必要があります。そして、この考え方によって、これはすべてのコレクションにとって真実でなければなりません。
質問には次のようなものがあります:私の思考プロセスは正しいのですか、何か不足していますか? これはが明示的にタイプを通過することなく達成することが可能であるタイプが明示的に保存であれば(私は元気です:
EDITは
@qqilihqは、次の質問を促した、優れたanswerを与えました何とか、ユーザーだけがそれを渡す必要はありません)
私は次のように試みましたが、動作しませんでした(タイプ消去のためだと思います):
public TypedList(List<T> delegate) {
this.delegate = Objects.requireNonNull(delegate);
this.type = (Class<T>) delegate.getClass();
}
しかし、おそらくあなたはこれに類似したことをすることができますか? this.type = T
。
+1、それは私が考えなかった方法です。次の質問は、明示的に**型をパラメータとして渡すことなく、これを実現することが可能であることです(あなたが 'delegate'から何らかの形でそれを抽出すると問題ありません。この新しい詳細で質問を編集します。 – Attilio
短くて否定的な答え:**明示的な型トークンなしで**不可能です。 'List'は実行時に 'List'になりますので、情報はそこにはありません。 'Class 'の型は、これが「一流の市民」であるため、実行時に 'Class'であっても、供給された型情報(例えば' String.class'、 ...) –
qqilihq
サイドノート: 'java.util.Collections'はまったく同じ原理に従います。 'java.util.Collections.checkedList(List、Class )' - 型引数を引数として明示的に渡す必要があります。 –
qqilihq