런타임 Java 클래스 확장이 작동하지 않습니다
-
19-09-2019 - |
문제
좋은 날, 나는 다음과 같은 문제가있다 : 클래스 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를 만드는 경우에만 발생합니다.