Динамические дженерики в Scala - PullRequest
3 голосов
/ 10 ноября 2011

Я использую стороннюю библиотеку , и подпись метода:

def parse[A](input: String)(implicit mf: Manifest[A]): A = ...

Я знаю только A во время выполнения. Как я могу вызвать метод parse выше с A, представленным в виде строки?

Является ли единственная опция, подходящая для всех моих доменных объектов?

* 1013 Е.Г. *

object ParserHelper {
  def apply(clazz: String, arg: String) = clazz match {
    case "DomainObjectA" => parse[DomainObjectA](arg)
    case "DomainObjectB" => parse[DomainObjectB](arg)
    case _ => throw new RuntimeException("Domain class %s not mapped" format clazz)
  }
}

... а затем позвонить ParserHelper("com.example.DomainObjectA", "some argument")?

т.е. как мне позвонить parse[???]("") где ??? динамически создается во время выполнения из строки типа "com.example.SomeDomainObject"?

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Я не думаю, что это возможно. Вам нужно знать что-то [A] во время компиляции, которое вы знаете только во время выполнения.

1 голос
/ 10 ноября 2011

Во-первых, вам нужно явно передать манифест: я думаю, вы можете, по крайней мере, получить немного Class[_] (Class.forName или что-либо еще, основываясь на вашем аргументе clazz).Вы можете создать манифест с помощью ClassManifest.classType(theClass).Вы получаете Manifest[_].

Тогда вам просто нужно составить процедуру, которая будет принимать Manifest[_]

def parseUntyped(input: String, m: Manifest[_]) = parse(input)(m)

parse(input)(m), набранную правильно.Учитывая, что m, если манифест некоторого типа, вызов является правильным.Конечно, тип возврата parseUntyped равен Any, и вам придется привести его обратно к тому, что вы хотите.

0 голосов
/ 11 ноября 2011

Заставьте эти классы расширять черту и используйте эту черту в качестве параметра типа. Помните, что в Scala типы компилируются во время компиляции. Если притворяться иначе, вы и / или ваш код сойдете с ума.

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