Можно ли ввести актеров на родительский абстрактный класс?
-
29-09-2019 - |
Вопрос
Я нахожусь в процессе переноса проекта 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
, не экземпляр класса, который он представляет.