我有以下类结构:
public interface Incoming<P extends Processor> {
void doSomething(P p);
}
public interface Processor<I extends Incoming> {
void process(I i);
}
public class MyIncoming implements Incoming<MyProcessor>
{
public void doSomething(MyProcessor p) { .. }
}
public class MyProcessor implements Processor<MyIncoming> {
public void process(MyIncoming i) { .. }
}
现在,在另一个类中,我传递一个MyIncoming的实例,该实例应该初始化为它在doSomething()中定义的Processor传递的类型?
请帮忙。
我在代码中看到的第一个问题是使用原始类型Incoming
和Processor
。
public interface Incoming<P extends Processor> {
void doSomething(P p); ^^
} that is a raw type!
去除这些原始类型的一种方法是使Incoming
和Processor
都有两个类型参数,但这非常复杂。
public interface Incoming<I extends Incoming<I, P>, P extends Processor<I, P>> {
void doSomething(P p);
}
public interface Processor<I extends Incoming<I, P>, P extends Processor<I, P>> {
void process(I i);
}
现在来谈谈你的实际问题。您已经说过,对于Incoming
的每个具体实现,您都有一个Processor
的特定实例,对于类型为Incoming
的变量t
,您希望能够找到该实例x
并调用x.process(t);
。我确信这可以通过反思来完成,但我看不出有什么意义。您可以将getProcessor
作为Incoming
的一种方法。
public interface Incoming<I extends Incoming<I, P>, P extends Processor<I, P>> {
void doSomething(P p);
P getProcessor();
}
现在您可以编写具体的实现了。
public class MyIncoming implements Incoming<MyIncoming, MyProcessor>
{
private static final MyProcessor PROCESSOR = new MyProcessor();
@Override
public void doSomething(MyProcessor p) { }
@Override
public MyProcessor getProcessor() { return PROCESSOR; }
}
public class MyProcessor implements Processor<MyIncoming, MyProcessor> {
@Override
public void process(MyIncoming i) { }
}
现在,如果你有一个通用类
class A<I extends Incoming<I, P>, P extends Processor<I, P>>
并且,在A
中,您有一个类型为I
的变量i
,您可以执行
i.getProcessor().process(i);
这是可行的,但我个人认为TypeA<B extends TypeB>
/TypeB<A extends TypeA>
形式的循环依赖关系是不必要的复杂,这里的泛型实际上对您不利。如果只将Incoming
和Processor
设为非通用接口,并在必要时使用强制转换,则可以保持您的理智。