成分和泛型

时间:2018-08-15 21:02:56

标签: java oop generics composition

我正在尝试解决这种“组合+泛型”情况,并使 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);
    }
}

2 个答案:

答案 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) {