Можно ли набрать приведение к родительскому абстрактному классу? - PullRequest
1 голос
/ 07 ноября 2010

Я в процессе переноса проекта 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 к (A) вызывает следующую ошибку:

java.lang.ClassCastException: java.lang.Class

По результатам отладки я подтвердил, что e.Handler действительно является типом класса FirstOuterClass $ FirstInnerClass. Так что либо есть различия в приведении между C # и Java (возможно), либо я не предоставляю правильный синтаксис где-то (также возможно).

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

Ответы [ 2 ]

3 голосов
/ 07 ноября 2010

Если один из ваших внутренних классов не смог привести к A, тогда ваше исключение будет выглядеть так:

java.lang.ClassCastException: FirstOuterClass $ FirstInnerClass не может быть приведен к A

Вместо этого вы получаете это:

java.lang.ClassCastException: java.lang.Class

Вы отсекаете "не может быть брошен на А" в конце этого?

Несмотря на это, похоже, что e.Handler имеет тип java.lang.Class. Как и в самом FirstOuterClass$FirstInnerClass, а не в единственном экземпляре.

0 голосов
/ 07 ноября 2010

Из сообщения об исключении видно, что вы пытаетесь привести экземпляр Class, а не экземпляр класса, который он представляет.

...