2011-04-15 59 views
0

我有使用泛型類聲明和界通配符:Java泛型 - 使用相同通配符多次

class Factory<T extends Logic<? extends Entity>, 
       U extends DAO<? extends Entity>> 
{ 
} 

基本上它是一種通用的工廠,這需要一個邏輯接口(T),並返回一個配置實現。爲了實例化邏輯,我採用了實現DAO接口(U)的適當的DAO類。

邏輯和DAO的兩個接口都是通用的,並將實體的類型作爲它們的類型參數使用。但是,我想進一步限制,以便DAO和邏輯不僅具有擴展實體的類型參數,而且它們擴展相同的實體。結果可能看起來類似於:

class <X extends Entity> Factory<T extends Logic<X>, 
       U extends DAO<X>> 
{ 
} 

我可以通過java泛型實現嗎?

回答

4

是的,你很近。像這樣做:

class Factory<X extends Entity, 
       T extends Logic<X>, 
       U extends DAO<X>> 
{ 
} 

替代

class Factory<T extends Logic<?>, 
       U extends DAO<?>> 
{ 
    // Here, the generic method parameter only requires X 
    // to be the same bound at method invocation. However, 
    // you will "lose" that information again when the 
    // Factory is returned. 
    public static <X extends Entity, 
        T extends Logic<X>, 
        U extends DAO<X>> Factory<T, U> createFactory(T logic, U dao) 
    { 
     return new Factory<T, U>(logic, dao); 
    } 
} 
+1

你也應該這樣做,如果你沒有一個已經:'接口邏輯'。 – Thomas 2011-04-15 12:20:35

+0

好點,托馬斯 – 2011-04-15 12:23:45

+0

我想你在Entity後錯過了一個逗號。你的解決方案可以工作,但是沒有解決方案,我不需要引入第三個類型參數?你的Factory版本可以這樣創建:'Factory = new Factory ();' - 對吧? @托馬斯:邏輯/ DAOs類型參數已經是有界的,這就是爲什麼我覺得工廠中關於關係的附加類型參數是多餘的。 – atamanroman 2011-04-15 12:23:47

0

將在下面的工作。 X將是「普通」類型,其中邏輯和DAO都將使用此類型。

public class Factory<X extends Entity, T extends Logic<X>, U extends DAO<X>> 
{ 
} 
1

另一種方法可以是提供一個包裝(雖然這不是真正的優雅;)):

class Entity{} 

interface Logic<T extends Entity> {} 

interface DAO<T extends Entity> {} 

interface DaoLogic<X extends Entity> { 
    DAO<X> getDAO(); 
    Logic<X> getLogic(); 
} 

class Factory<T extends DaoLogic<? extends Entity>> {}