编程语言
首页 > 编程语言> > java – 每种类型的通用接口vs接口

java – 每种类型的通用接口vs接口

作者:互联网

有两个类X,Y实现Base接口
有一个界面负责处理每种类型的对象

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

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

但这种方法的缺点是我必须为每种类型的对象(X,y ..)公开一个接口,如果有很多这样的对象,我最终会暴露出太多的接口.我以为我会通过暴露一个处理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,type-erasure,generics,generic-programming
来源: https://codeday.me/bug/20190624/1281996.html