コンパイル時または実行時にチェックを実行するかどうかは明確ではありません。メソッドに渡されるリスト パラメータに特定のタイプのオブジェクトが含まれていることを確認したいだけの場合は、T
適切に再定義してください。
たとえば、コンパイラが a のみList<Comparable>
をこのメソッドに渡すことを許可するようにするには、次のように再定義T
します。
public <T extends Comparable<? super T>> List<T> doSth(List<T> l) {
// Method body omitted
}
次に、(if-else ステートメントの代わりに) メソッドのオーバーロードを使用して、 の任意の値に対して正しいコードが呼び出されるようにしますT
。つまり、これを置き換えます。
public <T> List<T> doSth(List<T> l) {
if(T extends Comparable) {
// do one thing
} else {
// do another
}
return null
}
これ等と一緒に:
public <T extends Comparable<? super T>> List<T> doSth(List<T> l) {
// do one thing
return null;
}
public <T> List<T> doSth(List<T> l, Class<T> clazz) {
// do another
return null;
}
ただし、呼び出すオーバーロードされたメソッドを選択することと、ジェネリック型のチェックはコンパイル時のみであることを覚えておく必要があります。たとえば、次のコード:
List<? extends Serializable> alist = new ArrayList<Integer>();
doSth(alist);
実行時の型パラメーター ( ) は実装していますが、コンパイル時の型パラメーター ( ) は実装していないdoSth
ため、実際には 2 番目のメソッドを呼び出します。? extends Serializable
Comparable
Integer