Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用泛型调用父类的super()_Java_Generics - Fatal编程技术网

Java 使用泛型调用父类的super()

Java 使用泛型调用父类的super(),java,generics,Java,Generics,我有几个类都扩展了相同的抽象类编码器。抽象类要求其子类重写接受泛型类型参数的抽象方法(本例中为Subscriber)。重写此方法的每个子类对此参数使用不同的类型 abstract class Encoder<T> { protected String mSomeArg; public Encoder(String someArg) { mSomeArg = someArg+" super"; } public abstract void start(Su

我有几个类都扩展了相同的
抽象类编码器
。抽象类要求其子类重写接受泛型类型参数的抽象方法(本例中为
Subscriber
)。重写此方法的每个子类对此参数使用不同的类型

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);
  }

}
抽象类编码器{
受保护字符串mSomeArg;
公共编码器(字符串参数){
mSomeArg=someArg+“超级”;
}
公开摘要无效启动(用户);
}
类ExampleEncoder扩展了编码器{
公共示例编码器(字符串参数){
super(arg);//如何使super类获得泛型类型?
//例如:新编码器(arg)
}
@凌驾
公共无效启动(订户){
消息消息消息=新消息(“hi”+mSomeArg);
订户事件(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());
  }
});
Encoder sample=新示例Encoder();
sample.start(新订户(){
@凌驾
公共无效事件(消息消息消息){
日志(msg.text());
}
});
编码器otherSample=新的OtherEncoder();
sample.start(新订户(){
@凌驾
公共无效事件(其他事项){
Log(thing.toString());
}
});
问题:每个子类如何使用此抽象方法所需的泛型类型调用其
super()

注意:在本例的这个抽象方法中使用
Subscriber
,会破坏我使用泛型的目的。此外,用它所需的泛型类型实例化每个子类(例如:
newexampleconder()
)似乎是一个可行的解决办法,但也似乎没有必要这样做

class ExampleEncoder extends Encoder {
这是一个很好的例子。我很确定你想要像这样的东西

class ExampleEncoder extends Encoder<Message> {
类示例编码器扩展编码器{
如果希望具体类也是泛型的,那么可以使用

class ExampleEncoder<T> extends Encoder<T>
类示例编码器扩展编码器

但是你需要修改
start
以获得一个
订阅者

注意
类编码器
非常容易混淆(至少对我来说是这样)。泛型通常只使用一个字母,以便于识别。例如:
类编码器
。为了便于发布,对其进行编辑以使其更简单。