依賴

2014-03-04 54 views
0

我有以下接口:依賴

public interface Assembler<T, S> { 
    S assemble(T val); 
} 

public interface Slicer<T, V> { 
    V[] slice(T val); 
} 

我想有一個彙編程序實例中使用切片器實例,並調用它的切片()。我有以下幾點:

public class MyAssembler<T, S> implements Assembler<T, S> { 

    private final Slicer<T, V> slicer; 

    //ctor 
    public MyAssembler() { 
    slicer = new MySlicer<T, V>(); 
    } 

    @Override 
    public S assemble(T val) {   
     V[] v = mySlicer.slice(val); 
    } 

這不會編譯,因爲V形不知道(不能被解析爲一個類型)在MyAssembler。我無法將彙編器接口更改爲Assembler<T, S, V>。有另一種方法可以定義依賴關係嗎?這不是非泛型類的問題。即使使用靜態工廠方法來獲得切片機的參考,未知V的問題仍然存在。有什麼建議麼?如果不能這樣做,任何人都可以推薦一種不同的方法或設計模式,以允許彙編程序調用切片器的slice()?

+0

您可以爲'MyAssembler'聲明第三個類型變量。 –

+0

我嘗試過使用'MyAssembler '。它會編譯,但是一旦嘗試實例化,例如:彙編器 asmblr = new MyAssembler ,則編譯失敗:彙編器類型參數的數量不正確;它不能用參數進行參數化。 – pjscore10

+0

第三個類型參數對於'MyAssembler'是必需的,而不是聲明類型'Assembler'。但在這裏看起來並不是很有用,因爲你不用'V'做任何事情。 –

回答

0

重新發布Sotirios Delimanolis的評論作爲答案。

要允許在MyAssembler中使用V,請聲明MyAssembler<T, S, V> extends Assembler<T, S>。要使用它,請使用例如:Assembler<Integer, Integer> asmblr = new MyAssembler<Integer, Integer, Integer>進行實例化。

0

繼承將解決你的問題,而不是組成在這種情況下,如下圖所示:

public class MyAssembler<T,S,V> extends MySlicer<T,V> implements Assembler<T,S> { 

    public MyAssembler() { 
    } 

    @Override 
    public S assemble(T val) { 
     V[] v = this.slice(val); 
     ... 
    } 
} 
0

將彙編總是有切片機作爲其兩個仿製藥之一?如果是這樣,您只需要定義一個泛型,並將Slicer作爲非泛型成員變量。

但是,如果通用類型可能會或可能不會是切片機,可以實現對特殊的處理時,其中之一是切片機與反思,尤其是if (v instanceof Slicer)如果爲true,則鑄造切片。

+0

切片器不會是彙編器中的通用類型T或S之一。 – pjscore10

0

由於您的SV是通用的,您可以將它們換成任何其他類型,甚至是其他類型。你可以這樣做:

public class MyAssembler<T, S> implements Assembler<T, S> { 

    private final Slicer<T, S> slicer; 

    public MyAssembler() { 
     slicer = new MySlicer<T, S>(); 
    } 

    @Override 
    public S assemble(T val) { 
     S[] v = slicer.slice(val); 
     return v[0]; // for example 
    } 
} 

我所做的是確定TS爲同一類型。在我自己的實施中,我可以毫無問題地做到這一點。

+0

這可能會工作,假設類型將永遠是相同的,但是這不限制S和原來的V現在是相同的類型?可能希望組件S是字符串,切片器V是整數。 – pjscore10

+0

確實。但正如你所指出的那樣,彙編程序將*調用切片機的切片()*。如果S和V類型不同,你不能保證任何東西。你想如何將'V'投向'S'?通過調用'slice'你有'V',但在'assemble'裏面你想返回'S'。如果你想支持任意類型,你不能這樣做。但是:如我的例子所示,你不能選擇切片機的類型。它將由彙編器的類型決定。由於切片機封裝良好,因此您甚至不會知道組裝者背後的工作。您只需使用像黑盒子那樣的Assembler。 – exception1

+0

我覺得現在在彙編語言中使用V更爲靈活:'MyAssembler 擴展了彙編器'。 – pjscore10