Instalaciate具体类是scala中的通用方法

时间:2016-09-02 06:32:29

标签: scala generics

我有一个泛型方法,它是一个泛型类型参数T,它是MyClass的子类。在该方法中,我想创建T的新实例,我该怎么做?

这不起作用(因为类型擦除):

object Demo extends App {
  def myMethod[T <: MyClass](): Unit = {
      val t = new T // gives error: class type required by T found 
  }
  myMethod[MySubclassA]()
}


abstract class MyClass
class MySubclassA extends MyClass
class MySubclassB extends MyClass

2 个答案:

答案 0 :(得分:2)

它无法工作,但不是(主要)因为类型擦除,但是因为你的定义对于满足类型边界的所有T都有意义,而new T则不然。例如。 T可以是MyClass或抽象子类,或者没有无参数构造函数的子类,或者特征(特征可以扩展类),或者......

如果运行时错误足够好,您可以使用Sergey Lagutin的解决方案。但对大多数情况来说更合理的是通过某种方式来创建TmyMethod。可能是一个隐含的论点,例如

class Factory[T](f: () => T) {
  def make(): T = f()
}
object Factory {
  implicit val MySubclassAFactory = 
    new Factory(() => new MySubclassA) 
  implicit val MySubclassBFactory = 
    new Factory(() => new MySubclassB)
}
def myMethod[T <: MyClass](implicit factory: Factory[T]): Unit = {
  val t = factory.make()
  ...
}

myMethod[MySubclassA] // works
myMethod[MyClass] // compilation error
myMethod[ASubclassForWhichFactoryIsNotDefined] // compilation error

答案 1 :(得分:1)

您可以使用numpydoc来实现目标:

ClassTag