有两个类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(??);
}
有没有更好的方法来处理这个问题?
答案 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();
}
和多态将负责其余的事情。
在这种情况下,你甚至不需要泛型。