如果 A 扩展 B 扩展 C,为什么我可以强制转换为 A,但却得到 ClassCastException 强制转换为 C?

2024-01-08

我正在尝试在 Android 上使用 Bouncycastle 读取 ASN1 对象。我希望它是一个 DERSequence,它在 Bouncycastle 中是 ASN1Sequence 的子类,而 ASN1Sequence 是 ASN1Object 的子类。

import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.DERSequence;
...

ASN1InputStream ais = ...;
Object o = ais.readObject();
// Eclipse's debugger now says o is a DERSequence, as expected.

DERSequence o2 = (DERSequence)o;
ASN1Sequence o3 = o2;
ASN1Object o4 = o3;
// And o4 is now exactly what I want.

ASN1Object o5 = (ASN1Object)o;
// But this throws:
///    java.lang.ClassCastException: org.bouncycastle.asn1.DERSequence

根据答案的反馈,我构建了另一个更短的示例:

Object o = new DERSequence();
ASN1Object o1 = new DERSequence(); // This behaves fine.
ASN1Object o2 = (ASN1Object)o; // Throws ClassCastException.

是什么原因导致这次演员失败?


Android 在这里修改了类层次结构,请参阅中的注释http://www.netmite.com/android/mydroid/1.5/dalvik/libcore/security/src/main/java/org/bouncycastle/asn1/ASN1Sequence.java http://www.netmite.com/android/mydroid/1.5/dalvik/libcore/security/src/main/java/org/bouncycastle/asn1/ASN1Sequence.java您绝对确定您使用的 DERSequence 版本是 ASN1Object 的子类型吗?

例如它在这里http://www.eecs.berkeley.edu/~jonah/bc/org/bouncycastle/asn1/DERSequence.html http://www.eecs.berkeley.edu/~jonah/bc/org/bouncycastle/asn1/DERSequence.html

但不在这里http://www.androidjavadoc.com/m3-rc37a/org/bouncycastle/asn1/DERSequence.html http://www.androidjavadoc.com/m3-rc37a/org/bouncycastle/asn1/DERSequence.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 A 扩展 B 扩展 C,为什么我可以强制转换为 A,但却得到 ClassCastException 强制转换为 C? 的相关文章

随机推荐