Как я могу динамически набрать приведение значения в Scala? - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу эквивалент x.asInstanceOf [T], когда я не знаю T до времени выполнения. (Я использую Dotty, поэтому Scala отражение недоступно.)

Я пробовал это, но это не сработало:

object DynaCaster:

  def cast( victim: Any, asA: Class[_] ) =
    val classTag = ClassTag.apply(asA)
    _cast(victim)(classTag)

  private def _cast[T](v: Any)(implicit ct: ClassTag[T]): T = v.asInstanceOf[T]

Использование по назначению:

val x: SomeThing = ... // where SomeThing is a case class extending trait AnyThing
val anyThingValue = DynaCaster.cast(x, Class.forName("com.mystuff.AnyThing"))

// anyThingValue is now of class AnyThing
// Note: My actual use case cannot know the end types beforehand.  For example, this won't 
// work for my use:
// val anyThingValue: AnyThing = ...

Какой у меня загадочный сценарий использования? Я динамически вызываю конструктор класса, полученный с помощью отражения Java. Его аргументы типизируются для признака, в то время как фактические значения arg типизируются для конкретных классов этого признака. Мне нужно динамически привести конкретные значения классов к их типам признаков, чтобы вызвать конструктор.

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