Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果A扩展了B扩展了C,为什么我可以对A进行强制转换,而对C进行ClassCastException强制转换?_Java_Android_Classcastexception - Fatal编程技术网

Java 如果A扩展了B扩展了C,为什么我可以对A进行强制转换,而对C进行ClassCastException强制转换?

Java 如果A扩展了B扩展了C,为什么我可以对A进行强制转换,而对C进行ClassCastException强制转换?,java,android,classcastexception,Java,Android,Classcastexception,我正在尝试在Android上使用Bouncycastle读取ASN1对象。我希望它是一个DERSequence,在Bouncycastle中它是ASN1Sequence的子类,ASN1Sequence是ASN1Object的子类 import org.bouncycastle.asn1.ASN1InputStream; import org.bouncycastle.asn1.ASN1Object; import org.bouncycastle.asn1.ASN1Sequence; impor

我正在尝试在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在此处修改了类层次结构,请参阅中的注释您是否绝对确定您使用的版本中DERSequence是ASN1Object的子类型

e、 g在这里


但不是在这里

您可以尝试执行以下操作:

package classtest;

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

public class A {

    public static void main(String[] args) {
        testCast(new DERSequence());
    }

    private static void testCast(Object o) {
        DERSequence o2 = (DERSequence) o;
        ASN1Sequence o3 = o2;
        ASN1Object o4 = o3;

        ASN1Object o5 = (ASN1Object) o;
    }

}
(对我来说,这不会引发任何异常)


如果这不起作用,你应该检查vickirk的答案

你能转换到ASN1序列吗?这…很奇怪。那么
(ASN1Object)(ASN1Sequence)(DERSequence)o
呢p@John:这里面有什么相关的东西吗?这一行代码本身就导致了异常——堆栈中高于它的一切都是Android噪音。我发布的那一行是堆栈跟踪的第一行。@乔:你确定
对象
o
指向同一个引用吗?。这就是我问的原因。和什么一样?我没有省略任何代码之间的分配和铸造它。我发布的堆栈跟踪的第一行同意这是一个DERSequence。@vickirk:据我所知,我使用的是我自己的bcprov-jdk15-146.jar,我确信继承层次结构与我描述的一样。即使不是这样,那么较长的强制转换链是否会在某个时候导致ClassCastException?不确定较长的强制转换链是什么意思,android修改的强制转换链会从层次结构中删除ASN1Object。尝试添加一些代码来获取类及其父类,以验证类层次结构,如果它存在,那么不知何故,您最终得到了ASN1Object类的两个不同实例,无法想象在这种情况下会发生什么。@vickirk:我的示例代码就是这样做的。对DERSequence进行强制转换,然后隐式地向上转换回ASN1Object,效果很好。对不起,当你尝试这样做时,我以为你得到了ClassCastException,还是我误解了这个问题?@vickirk:o4分配的很好。o5不是。有关以类似方式失败的更简单情况,请参见我的更新。
Object o6=new DERSequence();asn1objectO7=(ASN1Object)o6导致相同的异常。