2017-01-30 4 views
1

Ich versuche zu bekommen den Runtime-Typen einer Variablen (nicht die Art der Referenz), dh die Ausgabe erhalte ich in der Scala-Konsole zu erhalten:Unable Laufzeit Typen einer Variablen in Scala

scala> val data = Seq(1,2,3) 
data: Seq[Int] = List(1, 2, 3) 

Was mich hier interessiert, ist, dass die Standardimplementierung von Seq ein List ist.

Wie kann ich diese Informationen in einer normalen Scala-Anwendung erhalten?

Ich habe versucht:

val data = Seq(1,2,3) 
println(data.getClass) 

aber das gibt

class scala.collection.immutable.$colon$colon 

Edit: Es scheint, dass ich die Ausgabe der scala Konsole falsch interpretiert. List ist nicht der Laufzeittyp, sondern der genaue Kompilierungszeittyp. Die Art der Referenz ist Seq

Antwort

4

Es richtige Antwort gibt, so weit wie :: eine Klasse, die als Implementierung verwendet wird

sealed abstract class List[+A]() extends scala.collection.AbstractSeq[A] with scala.collection.immutable.LinearSeq[A] 

final case class ::[B](private val hd : B, private[scala] val tl : scala.collection.immutable.List[B]) extends scala.collection.immutable.List[B] 
+0

I verstehe immer noch nicht, warum die Scala-Konsole 'List' und nicht' :: 'sagt? –

+0

Seq (...) gibt eine 'List' zurück, die Konsole verweist auf den Kompilierzeittyp. Wenn Sie getClass verwenden, erhalten Sie den genauen Laufzeittyp. '::' ist ein Untertyp von 'List'. 'List' ist infact abstrakt, so dass Sie niemals eine' List' als Laufzeittyp bekommen, sondern immer ein '' 'oder ein' Nil'. – puhlen

1

Wie @Sergey oben erwähnt wird, Cons ist eine Unterklasse von List

@SerialVersionUID(509929039250432923L) // value computed by serialver for 2.11.2, annotation added in 2.11.4 
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] { 
    override def tail : List[B] = tl 
    override def isEmpty: Boolean = false 
} 

die $colon$colon ist nur das toString von ::

Sprich, wenn ich eine Funktion namens

def :: ="hello" 

der Compiler erzeugen würde nur konvertieren diese

public String $colon$colon(){ 
    return "hello"; 
    } 

enter image description here

Referenzen sein: 1. https://github.com/scala/scala/blob/v2.12.1/src/library/scala/collection/immutable/List.scala#L1 2. http://www.scala-lang.org/api/2.12.1/scala/collection/immutable/List.html