2014-03-24 246 views
2

在我的應用程序中,我有一個Board。董事會由單元組成。每個單元格都有一個int值。 有幾種類型的Board將擴展Board。 每種類型的電路板將以不同方式表示電池。例如,一個會使用一個List,anothr會使用一個Tree。java「generic generic type」

原來這就是被試:

public abstract class Board<T> { 
    T<Cell> cells; //error - The type T is not generic; it cannot be parameterized with arguments <Cell> 

    protected abstract void setValues(T<Integer> values); 
} 

不幸的是,我不能將T泛型類型。 我該如何實施?

+0

也許讓'T擴展集合'在你的班級簽名?這樣你可以使用'List'或'Tree'?對我的建議不太自信,如果有必要,我想批評。 –

+0

你能提供一個你將用於'T'的類的例子嗎?通常情況下,您只需將參數化類型嵌套在Board的通用聲明中,但沒有任何意義的是擁有一個不受限制的'T'參數,然後您希望這個參數是通用的;如果'T'是'Integer'呢?此外,這是一種情況,只是子類化'Board'比擁有泛型參數更有意義嗎?畢竟,客戶必須意識到差異,如果它提供了他們的代表。 – chrylis

+0

草圖繪製兩個用例會非常有幫助。特別是你打算如何使用'setValues'方法,電路板應該如何在內部訪問它的'cells',以及'T'可以是什麼類型(當你說「Tree」時,你是指'TreeSet'?是一個'集合',那麼這是相當微不足道的......) – Marco13

回答

1

我發現你的方法太複雜了。 Peter.petrov接近我將要做的事。

如果List和Tree(TreeSet)是你所需要的,它們都實現了接口Collection,所以爲什麼不使用這個?除了添加,刪除和迭代之外,您還需要額外的工作嗎?

Collection (Javadoc)

所以,你的類可以看看(我加一點Java8功能)

public abstract class Board { 
    Collection<Cell> cells; 

    // Don't need to be abstract 
    protected void setValues(Collection<Integer> values) { 
     Stream<Cell> transformed = values.stream().map(Cell::new); 
     cells.addAll(transformed.collect(Collectors.toList())); 
    } 
} 

class Cell { 
    private Integer value; 

    Cell(Integer value) { 
     this.value = value; 
    } 
} 

如果你需要(因爲某些原因額外的東西,擴展此類和實現/重寫方法,將做特殊行爲)。希望我能幫上忙,但我真的沒有看到你的例子的用例。

+0

你可以在'setVaues'中解釋代碼嗎?另外,如果'cells'是一個List和'values'是一棵樹,會發生什麼? – AmitK

+0

第一行是新的(Java8),它將集合(可以是List,Set等)轉換爲流,然後從Integer映射到Cell。在Java8之前,您將需要For-each循環和匿名函數實現,但對於Java8,您可以輕鬆使用CONSTRUCTOR REFERENCE,它將採用每個元素(即String)並查找具有String和Contract Cell對象的構造函數。地圖返回流,你將它轉換爲Collection(這將是你的內部表示) – Lukino

+0

關於問題的後半部分,沒有Tree這樣的東西,有TreeSet,它會以同樣的方式工作(如果你從Collection 到TreeSet 。 – Lukino

0

我真的不太需要在這裏使用泛型。

public abstract class Board { 
    Holder<Cell> cells; 

    protected abstract void setValues(Integer[] values); 
} 

現在有你的列表和樹實現/擴展持有人。
您可以擁有2個ListHolder和TreeHolder類,它們都擁有
單元格,但其中一個由List支持,另一個由Tree支持。

實際上,它可能更有意義setValues是一個
持有人的方法,這兩個ListHolder和TreeHolder實現。

0

你需要有這樣的:

public abstract class Board<T extends OtherGenericClass<TT>, TT> { 
    T cells; 
    public Board(T cells) { 
     this.cells = cells; 
    } 
    protected abstract void setValues(T<Integer> values); 

    public static void main(String[] args) { 
     Cell<Integer> cells = new Cell<Integer>(); 
     Board<Cell<Integer>,Integer> board = new Board<Cell<Integer>,Integer>(cells); 
    } 
} 

這似乎並不像你想要什麼,雖然......我想你寧願這樣:

public abstract class Board<T> { 
    Cell<T>[] cells; 
    public Board(Cell<T>[] cells) { 
     this.cells = cells; 
    } 
} 

Cell類:

public abstract class Cell<T> { 
    T cellValue; 
    public Cell(T cellValue) { 
     return cellValue; 
    } 
} 
+0

'公共抽象類Board ,TT>'給了我完全相同的錯誤 – AmitK

+0

@AmitK對不起,我忘記更改部分代碼= p 再次檢查 –

+0

這似乎並不能幫助我改變電池結構 – AmitK