组合和泛型
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) {
我正在尝试解决这种 "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) {