一見類似したコードの異なるコンパイルの結果を理解しようとしています。 List<Object>
をList<T>
にキャストすることは可能ですが、T
がコンクリートクラスで結合されていない場合にのみ可能です。だから、class Test<T extends BigDecimal>
もclass Test<T extends BigDecimal & CharSequence>
にclass Test<T>
ならびにclass Test<T extends CharSequence>
ではなく...クラスの型パラメータのリストへのオブジェクトのキャストリスト
List<Object> bis = new ArrayList<>();
次コンパイルを与えられました。
List<T> result = (List<T>) bis;
だから、違いはクラス型とインタフェース型で囲まれたT
のためにから来たのでしょうか?
編集:
要求ごとにいくつかの完全なコード。これは9行目のコンパイラの警告でコンパイルされます。result
の項目を操作しているかのように、実際にはCharSequence
というインスタンスであるかのように安全ではありません。結果はClassCastException
です。
public class Sandbox<T extends CharSequence> {
public static void main(String[] args) {
new Sandbox<CharSequence>().foo();
}
private void foo() {
List<Object> bis = Arrays.asList(Integer.valueOf(1));
List<T> result = (List<T>) bis;
System.out.println(result);
}
}
しかし、これはまったくコンパイルされません:9行目で
public class Sandbox<T extends BigDecimal> {
public static void main(String[] args) {
new Sandbox<BigDecimal>().foo();
}
private void foo() {
List<Object> bis = Arrays.asList(Integer.valueOf(1));
List<T> result = (List<T>) bis;
System.out.println(result);
}
}
コンパイラエラー:List<T>
にList<Object>
をキャストすることはできません。 Arrays.asList(Integer.valueOf(1))
はあなたがCannot cast List<Object> to List<T>
を得る理由です、List<Integer>
を返しますので、
コードがさらに必要です。あなたのために失敗した正確な行を教えてください。 – markspace
'List
'T extends CharSequence'バージョンはコンパイルされません。 https://ideone.com/ySVuPr –