2017-01-09 6 views
0

Ich habe eine generische Klasse, die von multidimensionalen Daten (d.h. n-dimensionale Arary s oder Vector s) aufgebaut ist.
In diesem Fall möchte ich, dass die Klasse nur um einen Typ instanziiert wird (z. B. Vector), abgesehen von ihrer Dimensionalität (Vector[Vector[T]], aber nicht Vector[Array[T]]).
multidimensionalen Datentyp in Scala

Mit dieser Klasse Signatur:

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

wie kann ich garantieren, dass T zum Beispiel wäre Vector[T] oder Vector[Vector[T]] (oder etc ...), aber nicht Array[T] oder Vector[Array[T]]?

+0

Was ist der Unterschied zwischen Vectors [Array [Int]], die zweidimensionale mit unterschiedlichen Sammlungstypen und nicht erlaubt ist, und Vector [Array [Int]], die mit nur einem Kollektionstyp (Vector) eindimensional ist und die Elementtyp nur * passiert * zu Array [Int]? Was passiert, wenn dir jemand einen Vector [Vector [Int] geben will, aber sie wollen nur, dass du dich mit der äußeren Dimension beschäftigst und ihnen den inneren überlässt? Ab sofort, was wollen Sie brechen das Liskov Substitutionsprinzip: I in einem Vektor passieren kann [jeder], aber ich kann kein Vektor [Seq [_]] geben, auch wenn es ein Subtyp ist. – HTNW

Antwort

2

Während Generika von Typ-Löschung bei der Kompilierung ausgelöscht sind, können Sie auf den „Beweis“ Mechanismus verlassen.

Ein Beweis ist ein besonderes Ziel ist es, deren typeclass nur die Beziehung zwischen Typ A und Typ 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 

so können Sie schreiben etwas wie das

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

Innerhalb Ihrer Klasse zu bezeugen, Sie können einfach jedes Element von Vektor b als Vektor A behandeln, indem Sie den Beweis auf jeden Gegenstand anwenden: zB

Verwandte Themen