我正在尝试解决这种“组合+泛型”情况,并使 PostCompany.send(msg)与传递/注入到该类的类型兼容。
由于Fexed的send方法期望将String作为参数,而FeexPlus期望使用Integer,我该如何更改以允许Fedex和FedexPlus在PostCompany类中用作通用类型?
interface Poster<T> {
void send(T msg);
}
class Fedex implements Poster<String> {
@Override
public void send(String msg) {
// do something
}
}
class FedexPlus implements Poster<Integer> {
@Override
public void send(Integer msg) {
// do something
}
}
class PostCompany<P extends Poster> {
private final P poster;
public PostCompany(P poster) {
this.poster = poster;
}
public void send(??? msg) { // <-- Here
this.poster.send(msg);
}
}
答案 0 :(得分:5)
您错过了海报的类型
class PostCompany<T, P extends Poster<T>> {
public void send(T msg) { // <-- Here
this.poster.send(msg);
}
}
但是实际上键入对象的类型更好
class PostCompany<T> {
private final Poster<T> poster;
public PostCompany(Poster<T> poster) {
this.poster = poster;
}
public void send(T msg) { // <-- Here
this.poster.send(msg);
}
}
由于您将始终使用Poster的接口方法
答案 1 :(得分:2)
您在定义Poster
时使用的是PostCompany
的原始格式。您需要定义另一个类型参数来捕获Poster
的类型参数。
然后,您可以将该新的类型参数用作Poster
的类型参数和send
方法的参数类型。
class PostCompany<T, P extends Poster<T>> {
和
public void send(T msg) {