【发布时间】:2009-04-29 03:11:58
【问题描述】:
[更新]:我最初的例子没有反映我的问题。更新了示例,希望现在更好。
Java 泛型和重载不能很好地配合使用。
public interface Request<E> {
E getValue();
}
我上面有一个通用的参数化Request接口,我想写一个DataStore类来保存payload请求携带。不同payload类型的保存逻辑不同。
我真正想要的是类似的东西
public interface DataStore {
void save(Request<E1> r);
void save(Request<E2> r);
}
但这当然是非法的。
如果我想保持类型安全,DataStore 必须为我要处理的每种类型声明不同的方法,例如
public interface DataStore {
// here E1 is the actual type I want to handle, not a generic parameter
public void saveE1(Request<E1> e);
public void saveE2(Request<E2> e);
}
或者牺牲类型安全
public class DataStore {
public void save(Request e) {
Object value = e.getValue();
if (value instanceof ReqE1Impl) {
// do something
} else if (value instanceof ReqE2Impl) {
// do something else
}
}
}
两种方式都很糟糕!有没有更好的办法?
【问题讨论】: