2013-07-05 31 views
5

我有一個帶有嵌套通配符有界類型的有界類型參數的類。在類中我需要在多個方法中使用綁定嵌套參數的類型。有沒有辦法將通配符有界類型定義爲泛型類型參數,或將其分配給通用變量名稱,以便可以在多個位置輕鬆引用?Java嵌套通配符綁定類型多次或作爲泛型類型參數

類現在實現的方式是像

class AbstractManager<F extends Filter<? extends Criteria<? extends Type>>> 
    { 
     protected void setFilter(F filter) 
     { 
     setCriteria(f.getCriteria()); 
     } 

     protected <T extends Criteria<? extends Type>> void setCriteria(List<T> criteria) 
     { 
     } 

     protected <T extends Criteria<? extends Type>> void doSomethingWithCriteria(List<T> criteria) 
     { 
      ... 
     } 
    } 

不結合實際限制列表中的過濾器類型的類型,但是在我們的情況不夠好。理想情況下,列表的類型將被限制爲使用一個構造的過濾器類型,該構造可以將過濾器的推斷類型綁定到名稱上,就像方法上的有界類型參數,但在類級別上。

基本上我想這樣做

class <G extends Criteria<? extends Type> AbstractManager<F extends Filter<G>> 

據我所知,可以發現,這是不可能的,但我希望,也許有在Java 7中一個不起眼的功能或新功能,會使這成爲可能。 我知道它是可以指定像

class AbstractManager<F extends Filter<G>, G extends Criteria<? extends Type>> 

第二個類型參數,但我不希望子類有指定g當編譯器可以判斷它。

唯一可能的選項/解決方案,我已經能夠找到的是有一個淺子與在solution對此問題 Nested Type Parameters in JavaJava generics - use same wildcard multiple times

+0

你可以給你一個你想要的最終結果的樣本嗎? –

回答

1

工廠方法如果我理解你打算什麼這樣做會改變你班級的語義。 眼下在當前類,你可以有例如:

class T1 extends Type {} 
class T2 extends Type {} 
class C1 extends Criteria<T1> {} 
class C2 extends Criteria<T2> {} 
class C3 extends Criteria<T2> {} 
class F1 extends Filter<C1> {} 
class Manager extends AbstractManager<F1> {} 

然後,即使經理是基於F1,一些用戶代碼將是完全合法的,如果它做的事:

Manager m = new Manager(); 
C2 c2 = new C2(); 
C3 c3 = new C3(); 
m.setCriteria(Arrays.asList(new C2[]{c2}); 
m.doSomethingWithCriteria(Arrays.asList(new C3[]{c3}); 

我不知道這是否是你的意圖,但它是合法的(從編譯器的角度來看)。但是,如果您以某種方式能夠命名該通配符類型,則通過在方法中使用該名稱,可以限制類的用戶在所有方法中使用相同的類型。換句話說,在我的例子中,方法必須用C1的列表來調用。作爲一個結論,如果你想要你的例子具有的靈活性,你需要重複通配符;但如果你想有一個約束,該方法使用相同的標準管理器的過濾器,那麼你實際上給瞭解決方案:

class AbstractManager<F extends Filter<G>, G extends Criteria<? extends Type>> 

(或創建一個專用的子類型,以避免重複,正如你所提到的(任何你不喜歡的東西?))

+0

你是對的,當前的實現允許setCriteria/doSomethingWithCriteria中的不同類型比Filter中定義的類型,因此問題和對其他一些構造/機制的需求,例如在類級別命名約束,比如'class ',或者用非常理想的方式解決第二個參數。我應該在這個問題上說得更清楚。 – bdrx

+0

好的,那麼我認爲你的問題的簡短答案是不幸的:'不''你說得對,一個不太詳細的機制會很好。我認爲即使在描述中,最好的也能夠命名通配符。例如:'class AbstractManager >'能夠在類中的任何位置重用'F','C'和'T'。您可以隨時向Java 9的社區推薦它:) – Djizeus