2014-10-15 2 views
-3

현재 추상화 모델이 작동하지 않습니다. 왜, 어떻게 고쳐야하는지 잘 모르겠습니다. 다음과 같은 수업을 참조하십시오. return 문 중JAVA Generics design

AbstractError<ErrorCaptchRequired> myError = myObject.getAbstractError(); 
String captchaUrl = myError.getCaptchaUrl(); 

컴파일 오류 :

public class ErrorCaptchaRequired extends AbstractError { 

    public String getCaptchaUrl(){ 
     return this.captchaUrl; 
    } 
} 

public abstract class AbstractError<E extends AbstractError> { 

    public E getError(int errorCode){ 
     if(error_code == 1) 
      return new ErrorCaptchaRequired("abc", "abc", "abc"); 
     if(error_code == 2) 
      return new AnotherErrorType(); 
    } 
} 


    public class MyObject<E extends AbstractError>{ 
     private E error; 

     public E getAbstractError(){ 
      return error; 
     } 

} 

는 나중에 나는이처럼 사용할 Incompatible types을하지만 내 이해로 나는 내가 할 수있는 parametirized 클래스를했습니다 때문에 왜 확실하지 않다 AbstractError에서 확장되고 ErrorCaptchaRequired에서 확장되는 모든 유형을 반환합니다. 수정이나 더 좋은 디자인을 제안 해 주시겠습니까? 어떤 도움을 주셔서 감사합니다!

+0

@JeffreyBosboom, UPD ated! 감사! –

+0

* 완전한 * 코드를 게시하십시오. 'AnotherErrorType'가 빠졌고'getError()'의 마지막 return 문과 마찬가지로 어떤 줄이 컴파일러 오류를 가져 오는 지 알 수 있습니다. – EJP

답변

1

문제는 원시 (유형 없음) 유형입니다. 원시 형식에는 모든 일반 정보가 제거되어 형식 일치가 없습니다.

AbstractError 유형 자체 원료 인 : 변경 :

public abstract class AbstractError<E extends AbstractError> { 

public abstract class AbstractError<E extends AbstractError<E>> { 

옆은 ErrorCaptchaRequired 정도로 ErrorCaptchaRequired의 모든 인스턴스이고, AbstractError원료 (지정되지 않은) 형태를 확장 원시.

변경 :

public class ErrorCaptchaRequired<E extends AbstractError<E>> extends AbstractError<E> { 

변경 :

public class ErrorCaptchaRequired extends AbstractError { 

으로

public class MyObject<E extends AbstractError>{ 

사람 :

public class MyObject<E extends AbstractError<E>>{ 
+0

답변을 주셔서 감사합니다! 나는 당신이 말한대로했지만 여전히 불행하게도 컴파일 타임 오류가 발생했습니다'return new ErrorCaptchaRequired ("abc", "abc", "abc");'호환되지 않는 타입들 ' –

+0

당신은 여전히 ​​raw를 사용하고 있습니다. 'class ErrorCaptchaRequired extends AbstractError { '새로운 ErrorCaptchaRequired ("abc", "abc", "abc")'같은 것을 시도하거나'AbstractError'와 항상 같은 타입을 갖도록'ErrorCaptchaRequired'를 정의하십시오. ' – Bohemian