Я хочу эквивалент 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 типизируются для конкретных классов этого признака. Мне нужно динамически привести конкретные значения классов к их типам признаков, чтобы вызвать конструктор.