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 次 |
最近记录: |