Scala:使用私有构造函数从泛型类型创建实例



我有一个泛型类型参数的类,我想使用反射创建此类型的实例。此外,该类型有一个私有构造函数。下面是这个问题的代码示例:

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)

相关内容

  • 没有找到相关文章

最新更新