【发布时间】:2010-09-29 10:08:46
【问题描述】:
我有以下“通用”问题
这是我的通用消息接口。
public interface Message<P,R> {
void setParams(P Params); // and the corresponding getter
void setResults(R results);
}
为了简单起见,我想通过预定义参数和结果类型来指定一些(接口)消息。这样,如果您使用消息 X,您就会知道参数和结果类型是什么。
如
public interface MyMessage extends Message<String,String> {}
这很好,现在我想要一个可以实现任何消息的通用基类。
public class BaseMessage<P,R> implements Message<P,R> {
P param;
R results;
// base implementation
}
现在上面的问题是我不能有一个实现MyMessage的BaseMessage。
多次尝试
public class BaseMessage<T extends BaseMessage<P,R>> implements Message<P,R>
或
public class BaseMessage<? extends BaseMessage<P,R>> implements Message<P,R>
将不起作用,因为编译器抱怨 P 和 R 未绑定。 将它们作为附加参数引入再次起作用,但此时生成的类将无法转换为 BaseMessage 或所需的 MyMessage。
public class BaseMessage<P,R,T extends BaseMessage<P,R>> implements Message<P,R>
我想要一个通用工厂方法,它会被赋予消息类、参数和结果对象,并将返回一个实现 MyMessage 接口的 BaseMessage 实例。如下所示
public static <P, R, T extends Message<P,R>> T factory(Class<T> clazz,P p,R r) {
T a = (T) new BaseMessage<P,R>();
// create a BaseMessage which which Implements T
a.setParams(p);
a.setResults(r);
return a;
}
有没有人遇到过类似的问题,或者这在 Java 中是不可能的?
谢谢!
【问题讨论】:
-
public interface MyMessage extends BaseMessage这行不通,在您的示例中 BaseMessage 是一个类。 -
感谢您的评论,它确实应该阅读 public interface MyMessage extends Message
{}