Могу ли я в Scala динамически указать параметр типа параметрического типа?

Я пишу программу, в которой пользователь указывает путь к классу в командной строке. Я превращаю его в объект Class с помощью:

val clazz = Class.forName(args([0]))

У меня есть параметрический класс MyParametric[T] с одним параметром типа. Затем я хочу создать другой Class тип Class[ParamatricType[clazz], чтобы передать его методу, например Я хочу сделать что-то вроде

myMethod(classOf[ParametricType[clazz]])

но это не разрешено. Как я могу создать экземпляр параметрического типа с параметром типа, который задается динамически?


person gardenhead    schedule 30.11.2015    source источник


Ответы (4)


Если вы хотите использовать его в качестве аргумента для classOf, вам даже не нужен параметр типа. Вы можете просто использовать _, потому что параметры типа стираются во время выполнения в Scala:

myMethod(classOf[ParametricType[_]])
person sjrd    schedule 30.11.2015

Параметр типа ParametricType будет стерт, поэтому значение classOf[ParametricType[_]] будет одинаковым независимо от того, что вы подключаете для _ (включая _).

тип не будет таким же, как classOf, не будет таким же, как тот, который не стерт (компилятор отслеживает во время компиляции). Вы могли бы сослаться на одноэлементный тип clazz.type, но неясно, что вы за это купите.

person Rex Kerr    schedule 30.11.2015

Из предоставленной вами информации трудно сказать, будет ли пользователь указывать из набора известных классов (например, фруктов) или любого мыслимого класса. Однако вы можете использовать сопоставление шаблонов с разными классами во время назначения и обрабатывать их в соответствии с типом.

person sebszyller    schedule 30.11.2015

Если вам нужно сделать что-то большее, чем classOf (которое уже обрабатывают другие ответы), и вы можете изменить ParametricType, один из подходов будет (в зависимости от деталей того, что вам действительно нужно):

import scala.reflect.ClassTag
class ParametricType[T](implicit val tag: ClassTag[T])

val clazz: Class[_] = ...
myMethod(new ParametricType()(ClassTag(clazz)))
person Alexey Romanov    schedule 30.11.2015