【问题标题】:Calling super() to parent class using generics使用泛型调用 super() 到父类
【发布时间】:2014-12-28 02:24:20
【问题描述】:

我有几个类都扩展了相同的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&lt;?&gt; 会破坏我使用泛型的目的。此外,用它需要的泛型类型(例如:new ExampleEncoder&lt;Message&gt;())实例化每个子类似乎是一个可行的解决方法,但似乎也没有必要

【问题讨论】:

  • 请注意,class Encoder&lt;EventType&gt; 非常令人困惑(至少对我而言)。泛型通常只使用一个字母以便于识别。所以这将是:例如class Encoder&lt;T&gt;
  • 为方便发布而进行了编辑。

标签: java generics


【解决方案1】:

这个

class ExampleEncoder extends Encoder {

raw-type。我很确定你想要类似的东西

class ExampleEncoder extends Encoder<Message> {

如果您希望具体类也是通用的,那么您可以使用

class ExampleEncoder<T> extends Encoder<T>

但您需要修改start 以获取Subscriber&lt;T&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2014-05-23
    相关资源
    最近更新 更多