Pergunta

Tenha um bom dia, Eu tenho o seguinte problema: classe B estende classe A e métodos de ambos são chamados por outro método em outra classe após instanciar classe B (exemplo seguinte):

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;
    }
}

Classe B não substitui qualquer método de classe A. De alguma forma em tempo de compilação isso não obter qualquer erro, mas em tempo de execução excepts classe do chamador: java.lang.NoSuchMethodError: Factory.getB (objeto, enum) A

A minha pergunta é: se B se estende Um por um método de uma classe diferente não pode retornar um mesmo se sua cláusula retorna retornar um objeto B diretamente? Na verdade mudando:

public static B getB(object, enum);

com

public static A getB(object, enum);

resolve a exceção, mas depois eu recebo outra exceção (classCast) porque, obviamente, em outras partes do código que está aguardando um tipo B objeto, não um A.

Agradecemos antecipadamente.

Foi útil?

Solução

Você poderia obter essa exceção se você tinha compilado CALLER.java com outra versão do Factory.java que teria getB retornando A, em seguida, atualizados Factory.java para que getB retorna B, então recompilados Factory.java mas não CALLER.java

UPDATE:

Talvez você quer fazer algo como isto:

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;
    }
}

Mas, então, precisam ser instanciado da fábrica.

Outras dicas

Os primeiros olhares, como um erro de reflexão. As classes Java Reflection procurar a assinatura método exato "A getB (Object, Enum)" e não "B getB (Object, Enum)".
O segundo, contanto que você realmente criar um objeto do tipo B no seu método getB (..), ele irá retornar esse objeto. A exceção classCast só será lançada se você criar uma nova Uma vez de um novo B.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top