ジェネリック クラスは、次のsscceのように、そのコンストラクターで一致するジェネリック オブジェクトを必要とする場合があります。
import java.util.ArrayList;
import java.util.List;
public class GenericsIssue<K> {
public List<K> inner;
public GenericsIssue(List<K> input) {
if(input == null) throw new NullPointerException();
this.inner = input;
}
public K getFirst() {
if(inner.isEmpty()) return null;
return inner.get(0);
}
// Snip, code continues below
また、ファクトリ メソッドは、その引数でジェネリック型を指定しません。たとえば、これを行う場合があります。「チェックされていないキャスト」でさえ、警告はありません。
// Code borrowed from Guava source
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<E>();
}
// End Guava borrow
public static void main(String... args) {
ArrayList<String> list = newArrayList();
GenericsIssue<String> gi = new GenericsIssue<String>(list);
System.out.println(gi.getFirst()); // (Always null. Not relevant.)
}
}
ただし、これmain
はほぼ同じことですが、Eclipse でもコマンドラインでも、JDK 7u25 ではコンパイルされません。なんで?
public static void main(String... args) {
GenericsIssue<String> gi = new GenericsIssue<String>(newArrayList());
System.out.println(gi.getFirst());
}
コンパイラエラーは次のとおりです。
$ javac -d . -Xlint:unchecked GenericsIssue.java
GenericsIssue.java:23: error: constructor GenericsIssue in class GenericsIssue<K> cannot be applied to given types;
GenericsIssue<String> gi = new GenericsIssue<String>(newArrayList());
^
required: List<String>
found: ArrayList<Object>
reason: actual argument ArrayList<Object> cannot be converted to List<String> by method invocation conversion
where K is a type-variable:
K extends Object declared in class GenericsIssue
1 error