В scala, как создать ClassTag специализированного класса, используя ClassTag его общего члена?

В качестве примера возьмем общий класс 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]?

e.g.

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

так что:

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

и т.п.

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


person tribbloid    schedule 21.12.2019    source источник


Ответы (1)


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

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

person Alexey Romanov    schedule 22.12.2019
comment
Вау, это имя функции обманчиво :) - person tribbloid; 24.12.2019
comment
Неочевидно, конечно, но для того и смотришь на подписи :) - person Alexey Romanov; 24.12.2019