繁体   English   中英

在java中向下转换数组

[英]Downcasting of arrays in java

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

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; 与[Ljava.security.cert.X509Certificate;不兼容;

为什么?

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

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

您正在创建String[]类的对象,并在其中放入两个字符串。 有一种替代的写作方式,这使得更清楚:

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

您可以使用与向任何其他对象转换引用相同的方式转换对数组的引用; 您总是可以进行扩展转换(例如,将String[]类型的表达式赋值给Object[]类型的变量,并且可以使用显式转换进行缩小转换(例如,将Object[]类型的表达式赋值给a String[]类型的变量。 与其他对象一样,当您执行显式情况时,将在运行时检查对象的实际类,如果它不符合所需类型,则抛出ClassCastException 与其他对象一样,对象的实际类在转换时不会更改。 只有变量类型才有。

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

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

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

你不能在java中强制转换数组,但你可以通过执行以下操作来解决它:

Certificate[] certs = ...;
X509Certificate[] x509certs = new X509Certificate[certs.length];
for(int i = 0; i < certs.length; i++) {
  x509certs[i] = (X509Certificate)certs[i];
}

编辑: 这篇文章中显示替代方案。 但是,它涉及System.arraycopy() ,它可能在运行时执行相同的操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM