java - 在多级继承的情况下如何在java中覆盖具有通用返回类型的方法

标签 java

我有一个抽象类,其中包含一个返回泛型类型的抽象方法。 让我们说

abstract class AbstractSample{
  //class members

  //this method needs to be overriden
  public abstract SampleBuilder<? extends AbstractSample,?> copyBuilder ();

  //other methods
  //builder
  public static abstract class SampleBuilder<T extends AbstractSample, B extends SampleBuilder<T,B>> {
    //properties
    private String as;

    public SampleBuilder(AbstractSample object) {
      this.as = object.as;
    }

    public B as(String as) {
      this.as = as;
      return (B)this;
    }

    public abstract T build(); 
  }
}

现在我有一个类 Sample1,它扩展了这个类并实现了方法 copyBuilder()

public class Sample1 extends AbstractSample {
  //class members

  @Override
  public AbstractSample.SampleBuilder<Sample1,Sample1.Builder> copyBuilder()      {
    return new Sample1.Builder(this);
  }

  //other methods
  //builder
  public static class Builder extends SampleBuilder<Sample1,Builder> {
    //implementation
    //containing members and methods
  }
}

还有一个类 Sample2,它是 Sample1 的子类。 当我尝试覆盖此类中的方法 copyBuilder() 时,返回类型出现问题。

class Sample2 extends Sample1 {
  //class members

  // I am not allowed to implement this as below
  @Override
  public AbstractSample.SampleBuilder<Sample2,Sample2.Builder> copyBuilder() { 
    return new Sample2.Builder(this) ; 
  }

  //other methods
  //builder
  public static class Builder extends SampleBuilder<Sample2,Builder> {
    //implementation
    //containing members and methods
  }
}

IntelliJ 说该方法与父类(super class)中的方法冲突,试图使用不兼容的返回类型。

谁能建议如何在 Sample2 中实现方法 copyBuilder() 以便它返回 Sample2.Builder。

最佳答案

这里不需要泛型。这非常有效:

abstract class AbstractSample {

    public abstract SampleBuilder copyBuilder ();

    public static abstract class SampleBuilder {
        public abstract AbstractSample build();
    }
}

public class Sample1 extends AbstractSample {

    @Override
    public Sample1.Builder copyBuilder() {
        return new Sample1.Builder(this);
    }

    public static class Builder extends SampleBuilder {
        public Builder() { }
        public Builder(Sample1 d) { }

        @Override
        public Sample1 build() {
            return null;
        }
    }
}

class Sample2 extends Sample1 {
    @Override
    public Sample2.Builder copyBuilder() {
        return new Sample2.Builder(this) ;
    }

    public static class Builder extends Sample1.Builder {
        public Builder(Sample2 d) { }

        @Override
        public Sample2 build() {
            return null;
        }
    }
}

关于java - 在多级继承的情况下如何在java中覆盖具有通用返回类型的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42222401/

相关文章:

java - 通过强制转换返回不同对象的方法

java - 使用 Java 在 Linux 中执行命令并获取输出

java - 获取带有玻璃的 GWT PopupPanel 淡入淡出

java - 如何检索特定短信的联系方式?

java - ExecutorService 执行 REST 请求

java - 为什么这段 Java 代码的性能如此不一致?

java - Fellegi-Sunter 是否有开源实现?

java - 有很多 getters & setters 是个好主意吗?

java - 如何从javascript调用servlet

Java undefined object