簡體   English   中英

如何指定抽象類方法的返回類型

[英]How to specify the return type of the method of an abstract class

我發現了很多關於這個主題的帖子,但無法找到我想要的解決方案。

所以這里是交易:

我有一個帶有兩個子類的第一個抽象類:

public abstract class A {
  public A(args){..}
}
public class B extends A {
  public B(args){
    super(args);
  }
}
public class C extends A{
  public C(args){
    super(args);
  }
}

args是一些變量但不會改變形式。 其他一些東西都在課堂上,但這並不重要。

現在,我有另一個帶有兩個子類的抽象類,它們是B和C的構建器。構建器的大部分是相同的,所以我希望它在抽象構建器中

public abstract class Builder {
  public A build(*?*){
    //compute args
    return new *either B or C*(args);
  }
}
public class B_Builder extends Builder {
  public B build(*?*){
    super(*?*);
  }
}
public class C_Builder extends Builder{
  public C build(*?*){
    super(*?*);
  }
}

再一次,建設者中的其他東西並不重要。

我的問題是如何通過構建器子類告訴Builder abastract類構建的返回類型。 知道返回類型B和C都擴展了A.我想我應該使用一些通用的東西,但我無法使其工作。

誰能幫我 ?

非常感謝 !

LD

你可以使用泛型類型參數和抽象創建器方法來完成構建,而抽象類可以完成繁重的工作:

public abstract class Builder<T extends A> {
  public T build(*?*){
    //compute args
    return create(args);
  }

  protected abstract T create(args);
}

public class B_Builder extends Builder<B> {
  @Override
  protected B create(args) {
    return new B(args);
  }
}

public class C_Builder extends Builder<C>{
  @Override
  protected C create(args) {
    return new C(args);
  }
}

是的,你足夠接近,通用是要走的路:

A:

public abstract class A <T extends A<?>>{

    public abstract T getObject(Object args);
}

B:

   public class B extends A<B>{

        @Override
        public B getObject(Object args) {
            // TODO Auto-generated method stub
            return null;
        }

    }

C:

public class C extends A<C>{

    @Override
    public C getObject(Object args) {
        // TODO Auto-generated method stub
        return null;
    }


}

將模板參數添加到超類構建器。

class Builder<T> {
  T build() {}
}

然后,當你擴展使用類似的東西

   class ABuilder extends Builder<A> {
      A build() {}
    }

   class BBuilder extends Builder<B> {
      B build() {}
    }

完整代碼與Codiva在線編譯器IDE中的工作示例。

我建議將相同的部分放在一個方法中,B和C的創建代碼應該在子構建器中。

public abstract class Builder<T> {
  public abstract T create(args);
  public void build(args){
    //do something here
    return create(args); 
  }
}
public class BBuilder extends Builder<B> {
  @Override
  public B create(int args) {
    return new B(args);
  }
}

您只能使用一個構建方法保留一個構建器,如下所示:

public class BuilderA {
public static <T extends A> T of(Class<T> type, Object arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    Constructor<T> constructor = type.getConstructor(arg.getClass());
    return constructor.newInstance(arg);
}
}

此方法使用反射來構建具有指定類型的實例。 它假定在​​類A,B和C的構造函數中使用相同類型的參數。以下是調用的外觀:

    A a1 = BuilderA.of(B.class, 1);        
    A a2 = BuilderA.of(C.class, 2);
    B b = BuilderA.of(B.class, 2);
    C c = BuilderA.of(C.class, 2);

在上面的調用中,所有類都有一個Integer類型的構造函數。 如果您有多個參數,則可以使用varargs作為最后一個參數並檢索vararg的類並使用它們來檢索正確的構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM