我有以下“一般”问题
这是我的通用消息界面。
public interface Message<P,R> {
void setParams(P Params); // and the corresponding getter
void setResults(R results);
}
为了简单起见,我想通过预定义参数和结果类型来指定多个(接口(interface))消息。这样,如果您使用消息 X,您就知道参数和结果类型是什么。
比如
public interface MyMessage extends Message<String,String> {}
效果很好,现在我想要一个可以实现任何消息的公共(public)基类。
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 未绑定(bind)。 将它们作为附加参数引入会再次起作用,但此时生成的类将无法转换为 BaseMessage 或所需的 MyMessage。
public class BaseMessage<P,R,T extends BaseMessage<P,R>> implements Message<P,R>
我想要一个通用工厂方法,它将被赋予消息类、参数和结果对象,并将返回一个实现 MyMessage 接口(interface)的 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中是不可能的吗?
谢谢!
最佳答案
恐怕这样的通用工厂是不可能的,因为你无法实例化像这样的通用类型
T a = new BaseMessage<T>();
您必须告诉编译器确切的泛型类型参数。
您可以做的是创建每个具体消息类型的实例,并将它们存储在一个映射中,并以相应的类标记作为键。然后工厂方法可以查找正确的消息并直接返回它,或者(如果您需要单独的实例)使用消息对象作为 prototype创建要返回的实例。
我们当前的项目有一个有点相似的设计,不同之处在于具体的子类都是现有的类,具有不同的名称和(不幸的是大部分 - 但不完全 - 重复)实现。因此我们可以使用标准类加载和Spring来实例化它们。
关于java - 让一个类实现 java 中未指定的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3820599/