gda*_*ski 5 java eclipse generics casting
我正在尝试理解看似类似代码的不同编译结果.似乎有可能将a转换List<Object>为a,List<T>但仅限于T不受具体类限制.所以......
List<Object> bis = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
在下面的编译class Test<T>,以及在class Test<T extends CharSequence>,但不是class Test<T extends BigDecimal>也不class Test<T extends BigDecimal & CharSequence>.
List<T> result = (List<T>) bis;
Run Code Online (Sandbox Code Playgroud)
那么,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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这根本不编译:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
第9行中的编译器错误:无法转换List<Object>为List<T>.
好吧,这List<Object> bis = Arrays.asList(Integer.valueOf(1));显然不会编译,因为Arrays.asList(Integer.valueOf(1))会返回List<Integer>,这就是你得到的原因 Cannot cast List<Object> to List<T>。
第二种情况,eclipse 荒谬地编译,T extends CharSequence但我检查了在线编译器,它没有编译,所以很可能这是一个 eclipse bug。
| 归档时间: |
|
| 查看次数: |
748 次 |
| 最近记录: |