gpt4 book ai didi

java - 如何仅使用零参数构造函数通过 Java 反射创建具有上下文绑定(bind)的 Scala 类的新实例?

转载 作者:搜寻专家 更新时间:2023-11-01 01:29:09 25 4
gpt4 key购买 nike

我正在用 Scala 编写需要与 Java 框架交互的客户端代码。该框架负责创建通过 API 指定的类的对象实例,它使用反射来完成。例如:

public class ReflectionUtil {

public static <T> T newInstance(Class<T> aClass) {
T result;
try {
Constructor<T> meth = aClass.getDeclaredConstructor(new Class[]{});
meth.setAccessible(true);
result = meth.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
return result;
}
}

我要创建的对象实例的类是在 Scala 中实现的,并且在具有上下文绑定(bind)的类型上进行了参数化。例如:

class OrderedValue[A](var value: A)(implicit ord: Ordering[A]) {
def get: A = value
def set(x: A) = { value = x }
def cmp(that: OrderedValue[A]): Int = ord.compare(this.value, that.value)
}

当我将此类传递给 Java 框架以构造新实例时,我遇到了一个问题,因为框架假设该类将具有可用的零参数构造函数。例如,以下代码将导致 newInstance 中的 NoSuchMethodException:

def main(args: Array[String]) {

val a: OrderedValue[Int] = ReflectionUtil.newInstance(classOf[OrderedValue[Int]])
val b: OrderedValue[Int] = ReflectionUtil.newInstance(classOf[OrderedValue[Int]])

a.set(3)
b.set(5)

println(a.cmp(b))
}

解决此问题的尝试是向 OrderedValue 添加一个零参数构造函数,但是隐式参数 ord 没有合理的值。将其设置为 null 将导致 cmp 中的 NullPointerException:

def this() = this(null.asInstanceOf[A])(null.asInstanceOf[Ordering[A]])

另一种方法是子类化 OrderedValue 的特定具体值。例如:

class OrderedIntValue(val v: Int) extends OrderedValue[Int](v) {
def this() = this(null.asInstanceOf[Int])
}

val a: OrderedValue[Int] = ReflectionUtil.newInstance(classOf[OrderedValue[Int]])

这会起作用,但并不理想,因为并不总是方便或不可能知道 OrderedValue 的具体类型。例如,newInstance 可能会在一个范围内被调用,该范围也是一个类型的参数化(即我们不知道它具体是一个 Int)。

所以我的问题是:考虑到上下文边界(即类型类)在 Scala 中是一个非常有用且现在常用的功能,并且考虑到我无法更改我正在与之交互的 Java 框架的内部结构,因此有没有人遇到或开发了一种方法可以使这一切都奏效?

最佳答案

隐式参数由 Scala 编译器在编译时填充。如果您想使用反射来实例化类,则必须手动指定这些参数。没有办法解决它。因此,您可以拥有上下文边界或无参数构造函数。

关于java - 如何仅使用零参数构造函数通过 Java 反射创建具有上下文绑定(bind)的 Scala 类的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7117177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com