【发布时间】:2014-08-13 06:42:05
【问题描述】:
我有几个对象都实现了需要映射到的具体接口Op 任意类型。我正在尝试使用双重调度方法解决问题:
interface Mapper<R> {
R process(Op1 op1);
R process(Op2 op2);
}
interface Op<T>{
<R> R process(Mapper<R> mapper);
}
class Op1 implements Op<String> {
@Override
public <R> R process(Mapper<R> mapper) {
return mapper.process(this);
}
}
class Op2 implements Op<String> {
@Override
public <R> R process(Mapper<R> mapper) {
return mapper.process(this);
}
}
我为指定的Ops创建了一个映射器,映射到String:
Mapper<String> mapper = new Mapper<String>() {
@Override
public String process(Op1 op1) {
return "1";
}
@Override
public String process(Op2 op2) {
return "2";
}
};
问题
当我尝试将 Op 映射到 String 时:
Op op = new Op1();
String i = op.process(mapper);
进程的返回类型是Object而不是String。如果我更改 Op 接口,删除泛型,代码将按预期工作:
interface Op{
<R> R process(Mapper<R> mapper);
}
为什么编译器不接受Op接口中的泛型定义?
【问题讨论】:
-
您没有使用
Op上的泛型。您希望从他们那里获得什么? -
您说“编译器 [is] 不接受泛型定义”但没有包含错误消息。如果没有您看到的确切错误消息,很难确切知道您遇到了什么问题。
-
@Makoto 你是对的,我没有在示例中使用它,但即使在
Op方法上使用通用T,op.process类型的问题是相同的。如果我删除T,op.process返回正确的类型。 -
顺便说一句,这是访问者模式,除了未使用的
T类型参数之外,您的实现看起来大部分是正确的。 -
@LaurenceGonsalves 是的,错误是类型分配不兼容,
op.process返回 Object,而我希望它返回 String。