簡體   English   中英

使用泛型將super()調用到父類

[英]Calling super() to parent class using generics

我有幾個類都擴展了相同的abstract class Encoder 抽象類要求其子級覆蓋接受泛型類型參數的抽象方法(在此示例中為Subscriber<T> )。 覆蓋此方法的每個子類對此參數使用不同的類型。

abstract class Encoder<T> {

  protected String mSomeArg;

  public Encoder(String someArg) {
    mSomeArg = someArg+" super";
  }

  public abstract void start(Subscriber<T> subscriber);
}


class ExampleEncoder extends Encoder {

  public ExampleEncoder(String arg) {
    super(arg); // how to make super class get generic type?
    // eg: new Encoder<Message>(arg)
  }

  @Override
  public void start(Subscriber<Message> subscriber) {
    Message msg = new Message("hi "+mSomeArg);
    subscriber.event(msg);
  }

}

示例用例:

Encoder sample = new ExampleEncoder();
sample.start(new Subscriber<Message>() {
  @Override
  public void event(Message msg) {
    Log(msg.text());
  }
});

Encoder otherSample = new OtherEncoder();
sample.start(new Subscriber<OtherThing>() {
  @Override
  public void event(OtherThing thing) {
    Log(thing.toString());
  }
});

問題:每個子類如何使用此抽象方法所需的泛型類型調用其super()

注意:對於此示例,在此抽象方法中使用Subscriber<?>會破壞我使用泛型的目的。 此外,使用它所需的泛型類型實例化每個子類(例如: new ExampleEncoder<Message>() )似乎是一個看似合理的解決方法,但似乎也沒有必要

這個

class ExampleEncoder extends Encoder {

原型的 我很確定你想要的東西

class ExampleEncoder extends Encoder<Message> {

如果你想要具體類也是通用的那么你可以使用

class ExampleEncoder<T> extends Encoder<T>

但是您需要修改start以獲取Subscriber<T>

暫無
暫無

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

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