2017-01-09 20 views
0

多次元データ(つまり、n次元ArarysまたはVectors)から構築された汎用クラスを持っています。
この場合、その次元(Vector[Vector[T]]ではなくVector[Array[T]])以外のクラスを1つのタイプ(たとえばVector)でインスタンス化することを希望します。 (...かなど)
Scalaの多次元データ型

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

は、どのように私はTを例Vector[T]またはVector[Vector[T]]のためになることを保証することができますではなくArray[T]またはVector[Array[T]]

このクラスの署名を持って?

+0

異なるコレクション型の2次元であり、許可されないVector [Array [Int]]と、1つのコレクション型(Vector)のみを持つ1次元Vector [Array [Int]]の違いは何ですか?要素型はちょうど* Array * [int]になりますか?誰かにベクトル[ベクトル[Int]]を与えたいと思っても、あなたは外側の次元に対処して内側のものをそのまま残しておきたいですか?今のところ、あなたが望むのはLiskov Substitutionの原則を破るものです:私はVector [Any]に渡すことができますが、それはサブタイプでもVector [Seq [_]]を与えることはできません。 – HTNW

答えて

2

ジェネリックはコンパイル時にタイプ消去で消去されますが、「証拠」メカニズムに頼ることができます。

証拠は、その目的だけなので、あなたのクラス内でその

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

ような何かを書くことができますタイプ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 

を目撃することで、特殊な型クラスであります証拠を各項目に適用することによって、ベクトルbのすべての要素をベクトルAとして扱うことができます。すなわち、

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