gpt4 book ai didi

java - java中数组的向下转换

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:51:24 27 4
gpt4 key购买 nike

我不确定数组的向下转换是如何工作的。
这个有效的例子:

String[] sArray = {"a", "b"};  
Object[] o = sArray;
f((String[]) o);

static void f(String[] s){
System.out.println("Ok");
}

但对于以下内容:
new F(cert, (X509Certificate[]) ks.getCertificateChain("ALIAS"), key));
其中 F

public F(X509Certificate certificate, X509Certificate[] certificateChain, PrivateKey privateKey) {      
}

我得到 ClassCastException

java.lang.ClassCastException: [Ljava.security.cert.Certificate; incompatible with [Ljava.security.cert.X509Certificate;

为什么?

最佳答案

Java 中的数组是对象,因此有一个类。它们不仅仅是无身份的容器。当你说:

String[] sArray = {"a", "b"};

您正在创建类 String[] 的对象,并将两个字符串放入其中。有另一种写法可以使它更清楚:

String[] sArray = new String[] {"a", "b"};

您可以将引用强制转换为数组,就像您可以将引用强制转换为任何其他对象一样;您始终可以进行扩大转换(例如,将 String[] 类型的表达式分配给 Object[] 类型的变量),并且您可以使用显式转换(例如,将 Object[] 类型的表达式分配给 String[] 类型的变量)。与其他对象一样,当您执行显式 case 时,会在运行时检查对象的实际类,如果它不符合所需的类型,则会抛出 ClassCastException。与其他对象一样,对象的实际 在您转换时不会改变。只有 变量的类型 可以。

在您的情况下,它看起来像 ks.getCertificateChain("ALIAS") 返回一个 Certificate[]。有可能其中的元素是 X509Certificate 的实例,但数组本身仍然是一个 Certificate[]。当您尝试将其转换为 X509Certificate[] 时,失败了。

如果您需要一个 X509Certificate[],那么您需要做的就是将数组的内容复制到一个新数组中,该数组是一个 X509Certificate[]。您可以按照 tbk 的建议进行操作,或者您可以调用 Arrays.copyOf ,看起来像:

Certificate[] Certificates = ks.getCertificateChain("ALIAS");
X509Certificate[] x509Certificates = Arrays.copyOf(certificates, certificates.length, X509Certificate[].class);

关于java - java中数组的向下转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12210311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com