2017-01-09 105 views
0

我有一個泛型類,它由多維數據構成(即n維Arary s或Vector s)。
在這種情況下,我希望該類僅由一種類型實例化(例如Vector),除了它的維度(Vector[Vector[T]]但不是Vector[Array[T]])。
Scala中的多維數據類型

有了這個類簽名:

class Foo[T](x: Vector[T], y: Bar[T]) 

我怎麼能保證T公司將是例如Vector[T]Vector[Vector[T]](或等...),但不Array[T]Vector[Array[T]]

+0

Vector [Array [Int]]與兩個不同的集合類型(不允許)和Vector [Array [Int]]之間的區別是一維的,只有一個集合類型(Vector),而Vector元素類型只是*發生*爲Array [Int]?如果有人想給你一個Vector [Vector [Int]],會發生什麼情況,但他們只希望你處理外部維度並將內部維度留給他們?到目前爲止,你想要打破Liskov替換原則:我可以傳入Vector [Any],但是我不能給你一個Vector [Seq [_]],即使它是一個子類型。 – HTNW

回答

2

雖然泛型在編譯時被類型擦除抹去,但您可以依賴「證據」機制。

的證據是一種特殊類型類,其目標僅僅是見證A型和B之間的關係

A<:<B is a witness that A is a subclass of B 
A=:=B is a witness that A is a B 
A>:>B is a witness that A is a superclass of B 

所以你可以寫類似的東西

case class MyContainer[A,B](b:Vector[B])(implicit ev: B <:< Vector[A]) 

類裏面,您可以簡單地將向量b的每個元素作爲向量A應用於每個項目的證據:即

b flatMap { 
    x => ev(x) map {_.toString} 
}