假设我有一个特征Foo
,这个特征采用泛型Bar
,因此Foo的定义看起来就像
trait Foo[C <: Bar] {
def updateState(state : C) : C;
}
,我有几个扩展action1
的{{1}},action2
,action3
... action9
类。
现在,假设我想显式初始化这些操作的二维数组。
我试过
Foo
以及添加Array[Foo[Bar]](
Array(new action1, new action2),
Array(new action2, new action3)...
)
Array[Foo[Bar]](
Array[Foo[Bar]](new action1, new action2),
Array[Foo[Bar]](new action2, new action3)...
)
条形[Foo[Bar]]
而没有条形的大多数排列,使主数组[Foo]
等。
我使用
找到了解决问题的方法Array[Array[Foo[Bar]]]
并手动初始化每个维度,但我想知道是否有某种方法可以显式初始化实现通用特征的类型的2d数组...是的,我知道有大约3个用例来执行此操作(不是真的,但不是很常见)所以答案就像“你为什么要这样做?”或者“有更好的方法来处理bla bla bla”对我不会太有影响。
答案 0 :(得分:1)
如果您可以定义项目索引与类实例之间的关系,请使用:
tabulate[T](n1: Int, n2: Int)(f: (Int, Int) ⇒ T)
示例:
Array.tabulate(5, 5) {
case (i, j) => new action(i, j)
}
<强>更新强>
scala> :paste
// Entering paste mode (ctrl-D to finish)
trait Bar
class Foo[C <: Bar]
Array.tabulate(5, 5) {
case (i, j) => new Foo[Bar]()
}
// Exiting paste mode, now interpreting.
defined trait Bar
defined class Foo
res1: Array[Array[Foo[Bar]]] = Array(Array(Foo@5e1c4451, Foo@11c9521c, Foo@382db563, Foo@40df9365, Foo@1645ed29), Array(Foo@48d52a2b, Foo@22c39268, Foo@55c0fbac, Foo@70cb052f, Foo@20c18a83), Array(Foo@26caf42, Foo@2d66174c, Foo@98395dd, Foo@1de3e50c, Foo@5cd28628), Array(Foo@165dbb4, Foo@463b0723, Foo@4d51aeda, Foo@2dae91de, Foo@1fea9d40), Array(Foo@63f9e51e, Foo@2b3147d9, Foo@30640db6, Foo@78c0408b, Foo@15cda39c))