我有一个泛型类型参数的类,我想使用反射创建此类型的实例。此外,该类型有一个私有构造函数。下面是这个问题的代码示例:
class X private (x: Int) {
}
class Y private (y: Int) {
}
abstract class Foo[T](z : Int) {
var bar : T = createInstance[T](z)
def createInstance[T](z: Int) : M = {
???
}
}
这将允许我实例化Foo和访问栏:
class xFoo extends Foo[X]{
}
class yFoo extends Foo[Y]{
}
var xfoo = new xFoo(5)
println(xfoo.bar.x)
var yfoo = new yFoo(6)
println(yfoo.bar.y)
这应该打印出'5'和'6'。
我试过用下面的方法使用隐式。
def createInstance[T](z: Int)(implicit tag: TypeTag[T]) : T = {
val clazz = tag.tpe.getClass
val ctor = class.getDeclaredConstructor(classOf[Int])
ctor.setAccessible(true)
return ctor.newInstance(z).asInstanceOf[T]
}
然而,然后我得到错误:
No TypeTag available for T
一致var bar : T = createInstance[T](z)
有什么建议吗?谢谢你的帮助!
假设超类确实暴露了一些您正在寻找的方法/值,例如:
class X private(val x: Int) {}
你可以这样扩展它:
import scala.reflect._
class Foo[T](z : Int)(implicit ct: ClassTag[T]) {
var bar : T = createInstance[T](z)
def createInstance[T](z: Int) : T = {
val ctor = ct.runtimeClass.getDeclaredConstructor(classOf[Int])
ctor.setAccessible(true)
ctor.newInstance(Int.box(4)).asInstanceOf[T]
}
}
这允许你调用:
class XFoo(n: Int) extends Foo[X](n)
println((new XFoo(5)).bar.x)