سؤال

أنا بصدد نقل مشروع C# في Java. لدي جزء من التعليمات البرمجية التي تبدو هكذا:

public abstract class A
{
    public abstract void foo() throws Exception;
    public abstract void bar();
}

وبعد ذلك ، في مكان آخر ...

public class FirstOuterClass {
    public class FirstInnerClass extends A {
                  // defines foo() and bar()
    }
}

أبعد في مكان آخر ...

public class SecondOuterClass {    
     public class SecondInnerClass extends A {
                  // defines foo() and bar()
    }
}

وأخيرا ، حتى المزيد في مكان آخر ....

HashMap<Type, A> handlers = new HashMap<Type, A>();
        for (Entry e : HashMapOfStringToEntry.getTypes())
        {       
            if(e.Handler != null) {
                handlers.put(e.Type, (A) e.Handler);
            }
        }

يمكن أن يكون E.Handler إما نوعًا من FirstInnerClass أو SecondInnerClass. إنها محادثة E.Handler إلى (أ) التي تسبب الخطأ التالي:

java.lang.ClassCastException: java.lang.Class

لقد تحققت من ناتج تصحيح الأخطاء من أن E.Handler هو بالفعل نوع من الفئة من FirstOuterClass $ FirstInnerClass. لذلك ، إما أن هناك اختلافات في الصب بين C# & Java (ممكن) أو لا أقدم بناء الجملة الصحيح في مكان ما (ممكن أيضًا).

(أنا آسف لعدم لصق الكود بأكمله ، مثل ماهية HashMaps. لا أريد أن أشعل المشكلة الحقيقية. إنه في الأساس رسم خرائط بين مفتاح سلسلة واثنين من الفئات التي تمد التجريدة A.)

هل كانت مفيدة؟

المحلول

إذا كان أحد فصولك الداخلية يفشل في الإلقاء A, ، ثم يبدو استثناءك:

java.lang.classcastexception: لا يمكن إلقاء FirstouterClass $ firstInnerClass على

بدلاً من ذلك ، تحصل على هذا:

java.lang.classcastexception: java.lang.class

هل تقوم بقطع "لا يمكن إلقاؤه إلى" في نهاية هذا؟

بغض النظر ، يبدو ذلك e.Handler من النوع java.lang.Class. كما في ، FirstOuterClass$FirstInnerClass نفسها بدلا من مثيل واحد منه.

نصائح أخرى

من رسالة الاستثناء ، يبدو أنك تحاول إلقاء مثيل Class, ، ليس مثال الفئة التي يمثلها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top