如何找到方法参数的具体类



我有以下类结构:

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传递的类型?

请帮忙。

我在代码中看到的第一个问题是使用原始类型IncomingProcessor

public interface Incoming<P extends Processor> {
   void doSomething(P p);               ^^
}                               that is a raw type!

去除这些原始类型的一种方法是使IncomingProcessor都有两个类型参数,但这非常复杂。

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>形式的循环依赖关系是不必要的复杂,这里的泛型实际上对您不利。如果只将IncomingProcessor设为非通用接口,并在必要时使用强制转换,则可以保持您的理智。

相关内容

  • 没有找到相关文章

最新更新