我有下一段代码:
Certificate[] a = myFavouriteKeystore.getCertificateChain();
但是我需要将其传递给具有以下签名的方法:
void setCertificateChain(X509Certificate[] chain);
我可以执行以下操作吗?:
setCertificateChain((X509certificate[]) a);
IDE(eclipse)接受它,并且我认为编译器也可以这样做,但是我猜想即使所有数组元素都属于ClassCastException
类X509Certificate
或其子类。
答案 0 :(得分:7)
您将在运行时获得ClassCastException
,是的。
强制转换就像对编译器撒谎,说您真的知道自己在做什么,即使编译器无法证明强制转换将起作用-您正在指示它信任您。
编译器会监听您(并非在所有情况下,例如String
是最终的并且不能有子类,因此您不能告诉它将String强制转换为Integer),但是同时将字节代码checkcast
注入指令。
答案 1 :(得分:3)
经过测试,它失败并显示ClassCastException
错误:
package test;
public class TestClass {
public static class A { }
public static class B extends A { }
public static void main(String [] args) {
A[] a = new A[100];
for (int i = 0; i < a.length; i++) {
a[i] = new B();
}
B[] b = (B[]) a; /* Error: ClassCastException, even if all elements are of type B */
}
}
感谢@Eugene这么快就回答了这个问题。
这与铸造通用容器的策略一致。对于超类派生的容器,如果参数类型匹配,则仅强制类型转换。例如:Set<A>
和SortedSet<B>
的类型相同时,才能强制转换为A
。