我有一个抽象类,其中包含一个返回泛型类型的抽象方法。 让我们说
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/