簡體   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