我在代碼中看到的第一個問題是您正在使用原始類型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
非通用接口並在必要時使用鑄造,它可能會保持您的理智。
我不明白你的問題。你是說你有一個'MyIncoming'類型的變量或者一個'Incoming'類型的變量?如果你有一個'MyIncoming'類型的變量,你就知道這個類型是'MyProcessor'。 –
我有麻煩理解這個問題。請更詳細地描述您遇到的問題 –
還有一個類應該清除問題:class A {public void perform(T t){..}} - 現在我們需要找到T的類型通過,然後調用具體的處理器t? –
Mir