每种类型的通用接口与接口

时间:2013-10-08 14:35:23

标签: java generics generic-programming type-erasure

有两个类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(??);
}

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

3 个答案:

答案 0 :(得分:2)

正如@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

    }

}

答案 1 :(得分:1)

这与运行时无关。如果您编写类似

的内容,则已在编译时中删除了该类型
void process(Processor p){
  p.process(??);
}

如果您的Processor界面是通用的,则不应再使用原始类型:

<E extends Base> void process(Processor<E> p){
  p.process(…instance of E…);
}

例如:

<E extends Base> void processAll(Processor<E> p, Collection<? extends E> c){
  for(E item: c) p.process(c);
}

答案 2 :(得分:1)

process()方法 是否有参数?

你可以按照以下方式进行吗?

每个单独的类都实现了包含processor方法存根的公共接口void process(),从而创建了自定义操作。然后,您可以upcast将对象添加到接口(将它们放入如果需要的话,某种集合)。

您可以拥有以下内容:

List<Processor> p = new ArrayList<>();
p.add(new Xprocessor);
p.add(new Yprocessor);

for each(Processor pr: p) {
   pr.Processor();
}

和多态将负责其余的事情。

在这种情况下,你甚至不需要泛型。