문제

좋은 날, 나는 다음과 같은 문제가있다 : 클래스 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의 방법을 무시하지 않습니다. 컴파일 시간에는 오류가 발생하지 않지만 런타임 클래스 발신자는 다음과 같습니다.

내 질문은 : B가 다른 클래스의 메소드가 다른 클래스의 메소드가 A를 반환 할 수없는 이유 A를 연장하는 경우 반환 절 항목을 B 객체를 직접 반환하더라도 A를 반환 할 수없는 이유는 무엇입니까? 실제로 변화 :

public static B getB(object, enum);

~와 함께

public static A getB(object, enum);

예외를 해결하지만 코드의 다른 부분에서는 A가 아닌 B 유형 객체를 기다리고 있기 때문에 또 다른 예외 (클래스 캐스트)를 얻습니다.

미리 감사드립니다.

도움이 되었습니까?

해결책

다른 버전의 actory.java를 사용하여 getb를 반환 한 다음 agba를 업데이트 한 다음 getb가 b를 반환 한 다음 공장을 반환 한 다음 발신자.java가 반환되지만 발신자.java를 다시 고정시켰다.

업데이트:

아마도 당신은 다음과 같은 일을하고 싶을 것입니다.

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

그러나 공장은 시동해야합니다.

다른 팁

첫 번째는 반사 오류처럼 보입니다. Java Reflection 클래스는 "B getb (Object, Enum)"가 아닌 정확한 방법 시그니처 "a getb (Object, enum)"를 찾습니다.
두 번째는 실제로 getb (..) 메소드에서 유형 B의 객체를 생성하는 한이 객체를 반환합니다. 클래스 캐스트 예외는 새 B 대신 새 A를 만드는 경우에만 발생합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top