使用泛型将super()调用到父类

Bla*_*lia 4 java 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);
  }

}
Run Code Online (Sandbox Code Playgroud)

示例用例:

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());
  }
});
Run Code Online (Sandbox Code Playgroud)

问题:每个子类如何super()使用此抽象方法所需的泛型类型调用它?

注意:Subscriber<?>在这个例子中使用这个抽象方法会破坏我使用泛型的目的.此外,使用它所需的泛型类型(例如:)实例化每个子类new ExampleEncoder<Message>()似乎是一个看似合理的解决方法,但似乎也没有必要

Ell*_*sch 6

这个

class ExampleEncoder extends Encoder {
Run Code Online (Sandbox Code Playgroud)

原型的.我很确定你想要的东西

class ExampleEncoder extends Encoder<Message> {
Run Code Online (Sandbox Code Playgroud)

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

class ExampleEncoder<T> extends Encoder<T>
Run Code Online (Sandbox Code Playgroud)

但是你需要修改start才能拿到Subscriber<T>.