2015-10-04 16 views
0

的實例,我有這樣的代碼:如何創建一個參數化接口

ObjProcessor processor = getProcessor(); 
MyClass myObj = getObjToProcess();// MyClass extends PersistentObj 

和類:

public class ObjProcessor { 
    public <OP extends PersistentObj) void process(Class<OP> objClazz, OP object, Modifier<OP> modifier) { 
    ... 
    } 
} 
public interface Modifier<T> { 
    void modify(T obj); 
} 

我卡住了。如何創建修改器的實例能夠調用:

processor.process(myObj.getClass(), myObj, ???); 

羅恩C'S的評論之後,我創造了這個修改器:

Modifier<MyClass> mod = new Modifier<MyClass>() { 
    @Override 
    public void modify(MyClass obj) { 
     // empty 
    } 
}; 

proc.process(myObj.getClass(), myObj, mod); // compilation error! 

的Eclipse給這個錯誤:

The method process(Class<OP>, OP, Modifier<OP>) in the type ObjProcessor is not applicable for the arguments (Class< capture#1-of ? extends MyClass>, MyClass, Modifier<MyClass>) 
+0

您需要編寫一個實現'Modifier '的類。它可能是匿名的。 –

+0

您使用的是Java 8嗎? –

回答

0

您可以創建一個匿名內部類作爲012的一個實例接口:

processor.process(myObj.getClass(), myObj, new Modifier<MyClass>() { 

    @Override 
    public void modify(MyClass obj) { 
     //Add implementation here 
    } 
}); 

如果您使用java 8,你也可以使用lambada expressions。因爲你的interface被視爲功能接口(接口只有一個方法),你可以使用,而不是創建匿名類黏巴達表達:

processor.process(myObj.getClass(), myObj, obj -> { 
    //Add implementation here 
}); 

對於第二個問題,解決的辦法就是改變過程的聲明:

public <OP extends ObjProcessor> void process(Class<? extends OP> objClazz, OP object, Modifier<OP> modifier) { 

} 

我把它換成Class<OP>Class<? extends OP>。較舊的刪除僅適用於:MyClass.class,但不適用於:instanceOfMyClass.getClass()

原因是Class<OP>類型的參數不能接受Class<ClassExtendsOP>作爲參數,它只允許一個類。

如果傻冒使用MyClass作爲OP,當你使用MyClass.class ,你總是給我Class<MyClass>對象。但是當你使用instanceOfMyClass.getClass()時,你可以得到Class<ClassExtendsMyClass>,它與參數類型不匹配。

+0

感謝羅恩,但沒有解決它。我嘗試瞭解決方案後看到我的補充內容。 – 8xomaster

+0

我不能修改ObjProcessor,因爲它是第三方庫。 – 8xomaster

+0

然後你必須使用'MyClass.class'作爲參數。我即將解釋這個問題。 –

相關問題