2014-03-24 251 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