java - 让一个类实现 java 中未指定的通用接口(interface)

标签 java generics

我有以下“一般”问题

这是我的通用消息界面。

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/

相关文章:

.Net Web 应用程序问题中的 Java Applet

java - 如何对@ManyToMany关系中的相关实体进行排序

c# - 将通用列表传递给 ObservableCollection 构造函数

c# - 如何打印通用对象的属性

java - 有效地计算乘积 a * b² * c³ ...

Java Play - 如何制作一个包含 2 个字段的简单表单并将值发送到 Controller ?

java - Maven:构建可运行的 jar,然后使用 maven-assembly-plugin 添加到 zip

一般递归自类型值的 Java 字段类型?

java - 为什么 Java 不使用现有的类语言规范语法来进行泛型类型规范?

java - 什么是原始类型,为什么我们不应该使用它呢?