これは、候補者がJava言語に追加したいものとして、最近インタビューで尋ねた質問として浮上しました。Javaがジェネリックスを具体化していないことは、痛みとして一般的に認識されていますが、候補者がプッシュされたとき、候補者が実際に達成できたことを私に伝えることができませんでした。
当然、生の型はJava(および安全でないチェック)で許可されているため、ジェネリックを破壊しList<Integer>
て(たとえば)実際にが含まれている可能性がありますString
。タイプ情報を具体化すると、これは明らかに不可能になる可能性があります。しかし、これ以上のものがあるに違いありません!
人々が本当にやりたいことの例を投稿できますか?つまりList
、実行時にaのタイプを取得できることは明らかですが、それを使用して何をしますか?
public <T> void foo(List<T> l) {
if (l.getGenericType() == Integer.class) {
//yeah baby! err, what now?
編集:これに対する迅速な更新は、回答が主にClass
パラメータとして渡される必要性に関係しているように思われるためです(たとえばEnumSet.noneOf(TimeUnit.class)
)。私はこれが不可能であるという線に沿って何かをもっと探していました。例えば:
List<?> l1 = api.gimmeAList();
List<?> l2 = api.gimmeAnotherList();
if (l1.getGenericType().isAssignableFrom(l2.getGenericType())) {
l1.addAll(l2); //why on earth would I be doing this anyway?
findClass()
パラメーター化を無視する必要があるため、defineClass()
できませんでした)。そして、私たちが知っているように、下位互換性が最も重要なのは、その力です。