java - 通用接口(interface)与每种类型的接口(interface)

标签 java generics generic-programming type-erasure

有两个类 X, Y 实现了一个 Base 接口(interface) 有一个接口(interface)负责处理每种类型的对象

interface Base {
}
class X implements Base {
}
class Y implements Base {
}

interface XProcessor {
    void process(X object);
}
interface YProcessor {
    void process(Y object);
}

但这种方法的缺点是我必须为每种类型的对象(X,y..)公开一个接口(interface),如果有很多这样的对象,我最终会公开太多的接口(interface)。我想我会通过只公开一个接口(interface)来处理这个问题,该接口(interface)负责处理 Base 类型的对象

interface Processor<E extends Base> {
  void process(E object);
}

实现者编写自己的实现来处理类型 X 的对象

class XProcessor implements Processor<X> {
    void process(X object) {
        //do something
    }
}

这种方法的问题是当我必须在运行时调用方法过程时,我不知道应该将哪种类型的对象传递给处理器,因为在运行时我无法确定该处理器的类型

void process(Processor p) {
    p.process(??);
}

有没有更好的方法来处理这个问题?

最佳答案

正如@tredontho 所建议的,可以使用如下所示的工厂“ProcessorFactory”来获取相关实例,然后调用流程方法

public class ProcessTest {

    <T extends Base> void processBase(T base) {
        ProcessorFactory.getProcessor(base).process(base);
    }

}


interface Base{
}
class X implements Base{
}
class Y implements Base{
}

interface Processor<E extends Base>{
    void process(E object);
}

interface XProcessor extends Processor<X> {

}
interface YProcessor extends Processor<Y> {

}

class ProcessorFactory {

    @SuppressWarnings("unchecked")
    static <T extends Base> Processor<T> getProcessor(T base) {
        if (base instanceof X) {
            return (Processor<T>) new XProcessorImpl();
        }
        return null;
    }

}

class XProcessorImpl implements XProcessor {

    @Override
    public void process(X object) {
        // TODO Auto-generated method stub

    }

}

关于java - 通用接口(interface)与每种类型的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19250665/

相关文章:

generics - f# 可区分联合泛型

c# - 获取从 C# 中的 List<T> 派生的列表中的元素类型

c++ - 在依赖范围内调用静态函数模板

c++ - 通用类型别名,它们彼此不兼容

java - Java 服务器内的模式式编程

java - 哪种 Spring 安全身份验证方案适合移动和 Web 应用程序的 REST API?

java - 如何在 Android 中创建监听 localhost 端口的套接字

java - Jersey + Spark javax.ws.rs.core.UriBuilder.uri

C# 泛型方法,new() 构造函数约束中的类型参数

c++ - 如何推断模板中的 C++ 返回类型?