在java中,如何在多级继承的情况下使用泛型返回类型重写方法

在java中,如何在多级继承的情况下使用泛型返回类型重写方法,java,Java,我有一个抽象类,其中包含一个返回泛型类型的抽象方法。 比方说 抽象类AbstractSample{ //班级成员 //此方法需要重写 公共抽象SampleBuilder copyBuilder(); //其他方法 //建筑商 公共静态抽象类SampleBuilder{ //性质 私有字符串为; 公共SampleBuilder(AbstractSample对象){ this.as=object.as; } 公共B as(字符串as){ this.as=as; (B)本条; } 公共抽象T buil

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

抽象类AbstractSample{
//班级成员
//此方法需要重写
公共抽象SampleBuilder copyBuilder();
//其他方法
//建筑商
公共静态抽象类SampleBuilder{
//性质
私有字符串为;
公共SampleBuilder(AbstractSample对象){
this.as=object.as;
}
公共B as(字符串as){
this.as=as;
(B)本条;
}
公共抽象T build();
}
}
现在我有了一个类Sample1,它扩展了这个类并实现了copyBuilder()方法

public类Sample1扩展了AbstractSample{
//班级成员
@凌驾
public AbstractSample.SampleBuilder copyBuilder(){
返回新的Sample1.Builder(此);
}
//其他方法
//建筑商
公共静态类生成器扩展了SampleBuilder{
//实施
//包含成员和方法的
}
}
还有另一个类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
  }
}
类Sample2扩展了Sample1{
//班级成员
//我不允许按以下方式执行此操作
@凌驾
public AbstractSample.SampleBuilder copyBuilder(){
返回新的Sample2.Builder(此);
}
//其他方法
//建筑商
公共静态类生成器扩展了SampleBuilder{
//实施
//包含成员和方法的
}
}
IntelliJ说该方法与超类中的方法冲突,试图使用不兼容的返回类型

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

有谁能建议如何在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;
        }
    }
}

我不喜欢零件
B扩展SampleBuilder
。为什么引用它自己更有用

不管怎样,如果你改变,你可以让它工作

SampleBuilder copyBuilder()

SampleBuilder copyBuilder()

下面是一个完整的例子

public class Test {
abstract static class AbstractSample {

    private String as;

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

    public static abstract class SampleBuilder<T extends AbstractSample, B extends SampleBuilder<T, B>> {

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

static class Sample1 extends AbstractSample {

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

    public static class Builder extends SampleBuilder<Sample1, Builder> {

        public Builder(Sample1 sample1) {
            super(sample1);
        }

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

static class Sample2 extends Sample1 {

    @Override
    public SampleBuilder<? extends Sample2, ?> copyBuilder() {
        return new Builder(this);
    }

    public static class Builder extends SampleBuilder<Sample2, Builder> {

        public Builder(Sample2 sample2) {
            super(sample2);
        }

        @Override
        public Sample2 build() {
            return null;
        }
    }
}
}
公共类测试{
抽象静态类AbstractSample{
私有字符串为;
//此方法需要重写
公共抽象SampleBuilder copyBuilder();
公共静态抽象类SampleBuilder{
私有字符串为;
公共SampleBuilder(AbstractSample对象){
this.as=object.as;
}
公共B as(字符串as){
this.as=as;
(B)本条;
}
公共抽象T build();
}
}
静态类Sample1扩展了AbstractSample{
@凌驾
公共SampleBuilder copyBuilder(){
返回新的构建器(此);
}
公共静态类生成器扩展了SampleBuilder{
公共建筑商(样本1样本1){
超级(样本1);
}
@凌驾
公共样本1构建(){
返回null;
}
}
}
静态类Sample2扩展了Sample1{
@凌驾
公共SampleBuilder copyBuilder(){
返回新的构建器(此);
}
公共静态类生成器扩展了SampleBuilder{
公共建筑商(样本2样本2){
超级(样本2);
}
@凌驾
公共样本2构建(){
返回null;
}
}
}
}

谢谢你的回答。但我这里确实需要泛型。让我给出构建器的详细实现。您可能对Java中有关泛型返回类型的问题感兴趣:这意味着当我从Sample1的对象调用copyBuilder()时,类本身就是一个子类,然后它返回Sample1.Builder,它将被类型转换为SampleBuilder……这是否意味着Sample1扩展了Sample1?@bushra将
Sample1.Builder
更改为
使
copyBuilder()
方法可重写。不能重写方法并使返回类型不同或更一般。
public class Test {
abstract static class AbstractSample {

    private String as;

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

    public static abstract class SampleBuilder<T extends AbstractSample, B extends SampleBuilder<T, B>> {

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

static class Sample1 extends AbstractSample {

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

    public static class Builder extends SampleBuilder<Sample1, Builder> {

        public Builder(Sample1 sample1) {
            super(sample1);
        }

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

static class Sample2 extends Sample1 {

    @Override
    public SampleBuilder<? extends Sample2, ?> copyBuilder() {
        return new Builder(this);
    }

    public static class Builder extends SampleBuilder<Sample2, Builder> {

        public Builder(Sample2 sample2) {
            super(sample2);
        }

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