使用清单实例化视图边界类型



我正在尝试使用 Scala 的清单来实例化一个类型,当该类型在具有视图绑定的类型上参数化时,我遇到了问题。 我已将问题提炼为以下代码:

class foo[X <% Ordered[X]]() {}
def boo[T](implicit m : Manifest[T]) = { m.erasure.newInstance().asInstanceOf[T] }
boo[foo[String]]
java.lang.InstantiationException: foo
    at java.lang.Class.newInstance0(Class.java:357)
    at java.lang.Class.newInstance(Class.java:325)
    . . .

所以你可以看到我们有一个简单的类foo,它在X上参数化;它以Ordered[X]为界。 boo 函数只是尝试使用清单实例化 foo[String] 的新实例。 但是,当调用此函数时,事情变得非常糟糕,我得到了开始的堆栈跟踪,如我所示。 当 foo 的类型参数不是视图边界时,实例化可以正常工作。 我认为这与以下事实有关:绑定的视图只是语法糖,因为存在 X => Ordered[X] 的隐式转换,并且不知何故,依赖于另一个清单的清单导致了问题。 但是,我不知道到底发生了什么,更重要的是,我不知道如何解决它。 这在 Scala 中是否可能,如果不是,人们如何实现类似的东西?

newInstance仅在T具有无参数构造函数时才有效。 foo没有。视图绑定<%(就像上下文绑定:一样(是构造函数中隐式参数的快捷方式。

class foo[X <% Ordered[X]]class foo(implicit freshName: X => Ordered[X])相同。缺少用于foo的无参数构造函数,newInstance失败。

您可以通过以下方式使其工作:

def boo[A, B[_]](implicit toOrdA: A => Ordered[A], mf: Manifest[B[A]]): B[A] = {
  val constructor = mf.erasure.getConstructor(classOf[A => Ordered[A]])
  constructor.newInstance(toOrdA).asInstanceOf[B[A]]
}

最新更新