Например, у меня есть код выглядит следующим образом:Определите тип параметра во время выполнения в Scala
class Parent
class Child1 extends Parent
class Child2 extends Parent
class Foo {
def retrieve(arg: String): List[Parent] = {
arg match {
case "Child1" => get[Child1]()
case "Child2" => get[Child2]()
}
}
def get[T: Manifest](): List[T] = ...
}
В методе retrieve
, я хочу, чтобы упростить код в один get
вызов метода только, как это:
def retrieve(arg: String): List[Parent] = {
val t = arg match {
case "Child1" => ?
case "Child2" => ?
}
get[t]()
}
Можно ли достичь этого в scala?
UPDATE:
Я попробовал решение от ответа здесь, но у меня проблема, она не работает с перегруженной get
способом, например:
def get[T: Manifest](x: String): List[T] = ...
def get[T: Manifest, U: Manifest](x: String): List[(T, U)] = ...
К примеру, в retrieve
:
val t = arg match {
case "Child1" => manifest[Child1]
case "Child2" => manifest[Child2]
}
get("test")(t)
Я получил ambiguous reference to overloaded definition
ошибку компиляции на линии get("test")(t)
.
Возможный дубликат [Как обойти стирание стилей на Scala? Или, почему я не могу получить параметр типа моих коллекций?] (Http://stackoverflow.com/questions/1094173/how-do-i-get-around-type-erasure-on-scala-or-why -cant-i-get-the-type-paramete) – johanandren
Это не дубликат этого вопроса, он уже использует манифест. –
И он не хочет знать, как обойти стирание стилей, который он хочет узнать о реализации функции get каким-то другим способом. – curious