Если A расширяет B расширяет C, почему я могу привести к A, но получить приведение ClassCastException к C? - PullRequest
7 голосов
/ 12 апреля 2011

Я пытаюсь прочитать объект ASN1, используя Bouncycastle на Android. Я ожидаю, что это будет DERSequence, которая в Bouncycastle является подклассом 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.

Что вызывает сбой приведения?

Ответы [ 2 ]

2 голосов
/ 12 апреля 2011

Android имеет измененную иерархию классов здесь, см. Комментарий в 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.androidjavadoc.com/m3-rc37a/org/bouncycastle/asn1/DERSequence.html

0 голосов
/ 12 апреля 2011

Можете ли вы попробовать выполнить это:

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;
    }

}

(для меня это не исключение)

Если это не работает, вы должны проверить ответ викирка

...