【问题标题】:JAVA Generics designJAVA泛型设计
【发布时间】:2014-10-15 21:46:16
【问题描述】:

我当前的抽象模型不起作用。我不知道为什么以及如何解决它。请参考以下课程。

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

}

以后我想这样使用它:

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

返回语句期间的编译错误:Incompatible types 但我不知道为什么,因为我已经参数化了类,因此我可以返回从 AbstractError 扩展的任何类型,ErrorCaptchaRequired 正在扩展它。你能建议一个修复或更好的设计吗?谢谢你的帮助!

【问题讨论】:

  • @JeffreyBosboom,更新了!谢谢!
  • 请发布完整代码。 AnotherErrorType 丢失了,getError() 中的最终返回语句也丢失了,任何指示哪一行得到编译器错误的指示也丢失了。

标签: java oop generics inheritance


【解决方案1】:

问题在于原始(无类型)类型。原始类型从它们中剥离了所有通用信息 - 因此没有类型匹配。

AbstractError 的类型本身是原始的:更改:

public abstract class AbstractError<E extends AbstractError> {

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

接下来,ErrorCaptchaRequired 扩展了AbstractError原始(无类型)形式,因此ErrorCaptchaRequired 的每个实例都是原始的。

变化:

public class ErrorCaptchaRequired extends AbstractError {

收件人:

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

然后改变:

public class MyObject<E extends AbstractError>{

收件人:

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

【讨论】:

  • 感谢您的回答!我按照你说的做了,但不幸的是在return new ErrorCaptchaRequired("abc", "abc", "abc");Incompatible types
  • 您仍在使用它。尝试return new ErrorCaptchaRequired&lt;SomeAbstractErrorClass&gt;("abc", "abc", "abc") 之类的方法或定义ErrorCaptchaRequired 以使AbstractError 始终具有相同的类型,例如class ErrorCaptchaRequired extends AbstractError&lt;SomeConcreteAbstractErrorClass&gt; {
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
相关资源
最近更新 更多