2011-07-18 144 views
4

道歉爲通用標題,我真的不能想出一種方式來解釋這一點。仿製藥混淆

我想其中一個系統提供設施給用戶,其中有相關的應用請求對這些設施政策的場景建模。

public interface Facility { 
    public List<Policy> getPolicies(); 
} 
public interface Policy { 
    public void apply(Facility facility, Request request); 
} 
public interface Request { 

} 

但請求只能是明智的特定類型的設施,以及政策真的可以只適用於一個類型的設施和類型的特定於該類型的設施要求。

public interface Facility<F extends Facility<F>> { 
    public List<Policy<F, ? extends Request<F>>> getPolicies(); 
} 
public interface Policy<F extends Facility<F>, R extends Request<F>> { 
    public void apply(F facility, R request); 
} 
public interface Request<F extends Facility<F>> { 

} 

但我還希望能夠指定總體策略,以便它們可以應用於任何Facility超類型。

public interface Facility<F extends Facility<F>> { 
    public List<Policy<? super F, ? extends Request<F>>> getPolicies(); 
} 

但實際上你只想查詢適用於設施的特定類型的請求的策略。

public interface Facility<F extends Facility<F>> { 
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies(); 
} 

我的問題是現在我所有的仿製藥很困惑,我不能夠甚至創建適用於所有設施,這將是這樣一個策略類,如果它是合法的

public class GeneralPolicy implements Policy<T extends Facility<T>, Request<T>> 

我該如何去關聯設施,政策和請求的類型,以便根據上述說明有意義?我相信人們會要求澄清,我已經與這個足夠長的時間作鬥爭,以至於我可能沒有解釋某些東西,或者完全錯過了一個明顯的觀點。

+0

泛型的問題是,你可以定義一些如此通用的東西,這對編譯器來說並不意味着什麼。嘗試簡化你的模型。 –

+0

簡化模型將不可避免地導致API的客戶端必須做各種未經檢查的強制轉換,並作出編譯器無法保證的假設。避免這是泛型背後的全部原因。這些要求是相當可以理解的,我想我只是懷疑我一直在盯着我太久的努力,才能忘記問題的出路,並提出一個乾淨的解決方案。因此,SO問題。 – ptomli

回答

4

如果我讀這正確的,你真正想要做的是讓所有對於R.

public interface Facility<F extends Facility<F>> { 
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies(); 
} 

工作不幸的是,由於類型擦除,則不能將政策。在運行時,編譯器不知道R是什麼。

你能做什麼,但是,是通過類:

public interface Facility<F extends Facility<F>> { 
    public <R extends Request<F>> List<Policy<? super F, R>> getPolicies(Class<R> requestClass); 
} 

於是政策就需要返回其請求類型,以及:

public interface Policy<F extends Facility<F>, R extends Request<F>> { 
    public void apply(F facility, R request); 

    public Class<R> getRequestClass(); 
} 

功能的實現可以再雖可用策略列表,檢查策略的請求類型是否與實際請求的類型相匹配,然後返回該子集。

對於全局策略,策略可以返回Request.class。對於特定的,MyRequest.class。另外,我會說設施(至少你有它的方式)不需要被通用化,它會使代碼變得更簡單。

+0

我一直懷疑Request需要提供給getPolicies,主要是因爲可能有多種類型的Request適用於一個Facility並且我沒有在調用中提供足夠的信息來確定哪些是需要的。 --- 昨天晚上我曾經想過,如果Facility需要'自我輸入',因爲Facility >並得出結論,但我認爲這有助於允許實施方案優化getPolicies ()。 --- – ptomli

+0

好點。保持Facility也是通用的,這實際上是有意義的。我想如果你只是傳遞Request類到getPolicies,你會很好。 –

+0

基於我首先提供的最簡單的示例,您能否提出一組滿足要求的界面? 編輯超時過期,我無法獲得格式化權限,似乎不可能獲得換行 – ptomli