2012-09-20 98 views
3

我有一個通用的接口,它是由一個類實現的,我想在泛型方法中返回。 接口:用java中的具體實現返回一個通用接口

public interface IWorker<T extends Object, K extends Object> { 
public K doWork(T o); 
} 

實現:

public class WorkerImpl implements IWorker<String, List<Serializable>> 
{ 
    @Override 
    public List<Serializable> doWork(String s) 
    { 
     return ... 
    } 
} 

ActionCoordinator接口泛型方法返回的實現:

public interface IActionCoordinator 
{ 
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(T request); 
} 

ActionCoordinator實現:

public class ActionCoordinatorImpl implements IActionCoordinator 
{ 
    @Override 
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(final T requ) 
    { 
     return (IWorker<T,K>)new WorkerImpl(); 
    } 
} 

問題: 在eclipse中這會起作用,但是使用JDK 1.6.0_35做一個maven build並不是,並且說「不可轉換的類型」。我可以解決這個問題:

public class ActionCoordinatorImpl implements IActionCoordinator 
{ 
    @Override 
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(final T requ) 
    { 
     Object temp = new WorkerImpl(); 
     return (IWorker<T,K>)temp; 
    } 
} 

但是,它不應該是,這不會是類型安全的。

有些想法會很好。在此先感謝...

編輯:我現在適用於以下內容: 我改變了所有通用的Ts和Ks是可序列化的。這就是我需要限制WorkerImpl的一切。實際調用者仍然需要一個IWorker<T,K>IWorker<Serializable,Serializable>配合和工程...感謝大家,但我仍然不知道爲什麼日食什麼也不說......

+0

最後一個比上一個不安全。兩者都做同樣的事情。如果我執行'actionCoordinatorImpl .getAction(0)'? –

+0

這兩個版本看起來都是類型安全的。而'javac'是正確的抱怨。 –

+0

你確定它在Eclipse中有效嗎?如果它是一個java問題(和「不可轉換的類型」指向它),它應該落在兩者中)。 – SJuan76

回答

2

問題不在於maven 不會對進行編譯,而是Eclipse不會抱怨不安全的轉換:您可能在Eclipse偏好設置中關閉了一個選項,並在maven中進行嚴格編譯。

WorkerImpl不適合從你的工廠方法在ActionCoordinatorImpl返回,因爲有不能保證Serializable傳遞給它的doWork()方法將是一個String - 它只是爲任何Serializable


此外,您可以通過

public interface IWorker<T extends Object, K extends Object> 

改變IWorker

public interface IWorker<T, K> 

因爲它們是等價的簡化代碼(一切擴展對象)

+0

好抓!我指着類型擦除,但我更喜歡你的答案。 – SJuan76

+0

有沒有辦法做到類型安全? –

+0

@peatle_pp不需要你輸入'ActionCoordinatorImpl',使它成爲一個抽象工廠,或者傳遞'T'和'K'的類對象,並使用'instanceof'來確定'Worker '返回,但就編譯器而言,第二個選項仍然需要「不安全」轉換(但由於您已在代碼中檢查了類型,因此它不會不安全)。總的來說,我認爲你的設計需要簡化 - 不要太深入地看,你的層數太多了。 – Bohemian

0

WorkerImpl只實現IWorker<String, List<Serializable>> 。然後,您嘗試將其設置爲中的IWorker<T extends Serializable, K extends Serializable>,這是不正確的,應該報告爲錯誤。

推薦一個修復程序,直到你清楚你想要做什麼,這將是difficlt。

+0

謝謝......我想要一個'IActionCoordinator'並調用'getAction()'來爲我一個'IWorker '。有了這個Worker,我可以運行'doWork()'方法。調用者不必知道WorkerImpl到底在做什麼。 –

0

new WorkerImpl()收益率IWorker<String, List<Serializable>>,你打算如何將它轉換爲IWorker<T,K>?你認爲編譯器應該在哪裏得到類型K?當你調用getAction時,你會一直通過嗎?然後,您還必須傳遞類型T,但它也由參數requ設置,並且調用看起來很醜。