2017-01-30 4 views
1

Я стараюсь, чтобы получить во время выполнения типа переменной (не тип ссылки), то есть на выходе я получаю в консоли Scala:Невозможно получить тип выполнения переменной в Scala

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

Меня интересует, что стандартная реализация Seq - это List.

Как я могу получить эту информацию в обычном приложении Scala?

Я пробовал:

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

, но это дает

class scala.collection.immutable.$colon$colon 

Edit: Кажется, что я неправильно истолкован выходу консоли лестницы. List - это не тип времени выполнения, а точный тип времени компиляции. Тип ссылки является Seq

ответ

4

Это дает правильный ответ, насколько :: класс, который используется в качестве реализации

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 все еще не понимаю, почему консоль scala говорит 'List', а не' :: '? –

+0

Seq (...) возвращает «Список», консоль ссылается на тип времени компиляции. Когда вы используете getClass, вы получаете точный тип времени выполнения. '::' является подтипом 'List'. 'List' - это infact abstract, поэтому вы никогда не получите' List' как тип времени выполнения, он всегда будет '::' или 'Nil'. – puhlen

1

Как @Sergey уже упоминалось выше, Cons подкласс 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 
} 

$colon$colon это только ToString из ::

Скажите, если я создаю функцию под названием

def :: ="hello" 

компилятор просто преобразовать это будет

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

enter image description here

Ссылки: 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