В Scala, как создать ClassTag специализированного класса, используя ClassTag его универсального члена? - PullRequest
1 голос
/ 22 декабря 2019

Давайте используем общий класс Array[T] в качестве примера:


import scala.reflect.ClassTag

{
    val t = implicitly[ClassTag[String]]
    val ts = implicitly[ClassTag[Array[String]]]

    Seq(t, ts).foreach(println)
}

это даст следующий вывод:

java.lang.String
Array[java.lang.String]

Можно заметить, что тип String былне стирается из-за того, что Array имеет член специального типа.

Моя проблема в том, что тип String не известен во время компиляции. И у вас есть только ClassTag неизвестного типа T, вы все еще можете получить специализированный ClassTag массива [T]?

например

def arrayClassTagOf[T](implicit ev: ClassTag[T]): ClassTag[Array[T]] = ...

такой, что:

arrayClassTagOf[String] == implicitly[ClassTag[Array[String]]
arrayClassTagOf[Int] == implicitly[ClassTag[Array[Int]]

и т. Д.

Большое спасибо за ваше мнение!

1 Ответ

4 голосов
/ 22 декабря 2019
def arrayClassTagOf[T](implicit ev: ClassTag[T]): ClassTag[Array[T]] = ev.wrap

Да, уже есть def wrap: ClassTag[Array[T]] для этой конкретной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...