组合和泛型

Composition and generics

我正在尝试解决这种 "composition + generics" 情况,并使 PostCompany.send(msg) 与类型 passed/injected 兼容class.

由于 Fexed 的发送方法需要字符串作为参数而 FeexPlus 需要整数,所以我可以更改什么以允许 Fedex 和 FedexPlus 在 PostCompany class 中用作通用类型?

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

您错过了海报的类型

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 的接口方法

您在定义 PostCompany 时使用了 Poster 的原始形式。您需要定义另一个类型参数来捕获 Poster.

的类型参数

然后您可以将该新类型参数用作 Poster 的类型参数和 send 方法的参数类型。

class PostCompany<T, P extends Poster<T>> {

public void send(T msg) {