Расширение класса Java во время выполнения не работает - PullRequest
0 голосов
/ 11 марта 2010

Добрый день, У меня есть следующая проблема: класс B расширяет класс A, и методы обоих вызываются другим методом в другом классе после создания экземпляра класса B (пример следует):

public class A{
    //fields
    //constructors
    //methods
}

public class B extends A{
    //fields
    //constructors
    //methods
}

public class CALLER{

    public A getA(enum E){
        return Factory.getB(otherobject,E);
    }
}

public class Factory{
    public static B getB(object o,enum e){
         //do something with enums and get B
         b = new B();
         //populate b
         return b;
    }
}

Класс B не переопределяет любой метод класса A. Каким-то образом во время компиляции это не вызывает ошибки, но во время выполнения класс CALLER исключает: java.lang.NoSuchMethodError: Factory.getB (object, enum) A

Мой вопрос: если B расширяет A, почему метод из другого класса не может вернуть A, даже если его предложение return возвращает объект B напрямую? На самом деле меняется:

public static B getB(object, enum);

с

public static A getB(object, enum);

решает исключение, но затем я получаю другое исключение (classCast), потому что, очевидно, в других частях кода он ожидает объект типа B, а не A.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Вы получили бы это исключение, если бы вы скомпилировали CALLER.java с другой версией Factory.java, в которой getB вернул бы A, затем обновили Factory.java, чтобы getB вернул B, затем перекомпилировали Factory.java, но не CALLER.java

UPDATE:

Возможно, вы хотите сделать что-то вроде этого:

public abstract class Factory {
    public abstract A getInstance(object o, enum e);
}

public class FactoryB extends Factory {
    @Override
    public B getInstance(object o,enum e){
         //do something with enums and get B
         b = new B();
         //populate b
         return b;
    }
}

Но тогда нужно было бы создать экземпляр фабрики.

0 голосов
/ 11 марта 2010

Первый выглядит как ошибка отражения. Классы отражения java ищут точную сигнатуру метода «A getB (Object, Enum)», а не «B getB (Object, Enum)».
Во-вторых, пока вы действительно создаете объект типа B в вашем методе getB (..), он будет возвращать этот объект. Исключение classCast будет сгенерировано, только если вы создадите новый A вместо нового B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...