В Scala, почему невозможно вывести TypeTag из псевдонима типа или зависимого типа? - PullRequest
2 голосов
/ 13 января 2020

У меня есть простая scala программа для проверки возможности Scala на вывод классов классов:

import scala.reflect.ClassTag

object InferTypeTag {

  import org.apache.spark.sql.catalyst.ScalaReflection.universe._

  def infer(): Unit = {
    type U = (Int, String)

    val ttg1 = implicitly[TypeTag[(Int, String)]]

    val ttg2 = implicitly[TypeTag[U]]

    val ctg = implicitly[ClassTag[U]]
  }
}

ttg1 было получено без проблем.

ttg2 вызвала следующую ошибку компиляции:

Error:(14, 26) No TypeTag available for U
    val ttg2 = implicitly[TypeTag[U]]

Вопрос 1 : почему это не работает? тип U уже окончательный и его невозможно переопределить

Вопрос 2 : если тип U не является окончательным и не зависит от пути, почему ctg может быть выведен успешно?

1 Ответ

2 голосов
/ 13 января 2020

Может быть, кто-то объяснит, почему локальный тип выглядит абстрактно. Может быть, просто ошибка.

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> { type X = Tuple2[Int, String] ; weakTypeTag[X] }
res0: reflect.runtime.universe.WeakTypeTag[X] = WeakTypeTag[X]

scala> { type X = Tuple2[Int, String] ; typeTag[X] }
                                               ^
       error: No TypeTag available for X

scala> { type X = Tuple2[Int, String] ; weakTypeTag[X].tpe }
res2: reflect.runtime.universe.Type = X
...