![](/img/trans.png)
[英]Using generics “super” in implements/extends part of a class declaration
[英]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.