Можно ли ввести актеров на родительский абстрактный класс?

StackOverflow https://stackoverflow.com/questions/4119063

Вопрос

Я нахожусь в процессе переноса проекта 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 (возможно), либо я не предоставляю правильный синтаксис где -то (также возможно).

(Прошу прощения за то, что не вставил весь код, например, для того, для чего нужны хэшмапы. Я не хочу смешать реальную проблему. По сути, это отображение между стрункой и парой классов, которые расширяют абстрактные А.)

Это было полезно?

Решение

Если один из ваших внутренних классов не удалось поднять на 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