2015-11-08 30 views
0

我有以下類的結構:如何找到具體類的方法參數的

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()中定義?

請幫忙。

+1

我不明白你的問題。你是說你有一個'MyIncoming'類型的變量或者一個'Incoming'類型的變量?如果你有一個'MyIncoming'類型的變量,你就知道這個類型是'MyProcessor'。 –

+1

我有麻煩理解這個問題。請更詳細地描述您遇到的問題 –

+0

還有一個類應該清除問題:class A {public void perform(T t){..}} - 現在我們需要找到T的類型通過,然後調用具體的處理器t? – Mir

回答

1

我在代碼中看到的第一個問題是您正在使用原始類型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非通用接口並在必要時使用鑄造,它可能會保持您的理智。

+0

不把getProcessor()放入Incoming接口的一個原因是,它不會強制doSomething()中傳遞的Processor類型必須與getProcessor()返回的相同。 – Mir

+0

我不知道你的意思。 'getProcessor()'返回'P'。 'doSomething'接受'P'。 –

相關問題