如果我将T的数组强制转换为Q的数组(Q是从T派生的),是否依次转换了每个元素?

时间:2019-05-20 08:45:57

标签: java

我有下一段代码:

Certificate[] a = myFavouriteKeystore.getCertificateChain();

但是我需要将其传递给具有以下签名的方法:

void setCertificateChain(X509Certificate[] chain);

我可以执行以下操作吗?:

setCertificateChain((X509certificate[]) a);

IDE(eclipse)接受它,并且我认为编译器也可以这样做,但是我猜想即使所有数组元素都属于ClassCastExceptionX509Certificate或其子类。

2 个答案:

答案 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