我有一个泛型方法,它是一个泛型类型参数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
答案 0 :(得分:2)
它无法工作,但不是(主要)因为类型擦除,但是因为你的定义对于满足类型边界的所有T
都有意义,而new T
则不然。例如。 T
可以是MyClass
或抽象子类,或者没有无参数构造函数的子类,或者特征(特征可以扩展类),或者......
如果运行时错误足够好,您可以使用Sergey Lagutin的解决方案。但对大多数情况来说更合理的是通过某种方式来创建T
到myMethod
。可能是一个隐含的论点,例如
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