使 Scala 代码可与 Java 库互操作
Making Scala code interoperable with a Java library
我有一个 Java 库,我必须使用/调用它,我是从 Scala 做的。 Java 库有这样的签名:
JavaFunction( List<Object[]> data) {
this.data = data;
}
我假设要与 Scala 兼容,我需要一个 AnyRef,所以我定义了这个:
val fromScala: List[Array[AnyRef]] = List(
Array[AnyRef](1, "Str1", 'a'),
Array[AnyRef](2, "Str2", 'b'),
Array[AnyRef](3, "Str3", 'c'),
Array[AnyRef](4, "Str4", 'd')
)
当我试图将其传递给构造函数时,在编译时遇到以下错误:
the result type of an implicit conversion must be more specific than AnyRef
Array[AnyRef](1, "Str1", 'a')
我知道编译器期望我应该明确我的类型,但我没有看到任何其他方式来使其兼容。有什么想法吗?
问题是 1
它们是 AnyVal
而不是 AnyRef
因此隐式转换发生在幕后。
您可以使用 Int.box(1)
创建 java.lang.Integer
但是,装箱仍然会在运行时发生,因此您只是添加样板文件,您可以尝试查看 List[Array[Any]]
是否按预期编译和工作。
我有一个 Java 库,我必须使用/调用它,我是从 Scala 做的。 Java 库有这样的签名:
JavaFunction( List<Object[]> data) {
this.data = data;
}
我假设要与 Scala 兼容,我需要一个 AnyRef,所以我定义了这个:
val fromScala: List[Array[AnyRef]] = List(
Array[AnyRef](1, "Str1", 'a'),
Array[AnyRef](2, "Str2", 'b'),
Array[AnyRef](3, "Str3", 'c'),
Array[AnyRef](4, "Str4", 'd')
)
当我试图将其传递给构造函数时,在编译时遇到以下错误:
the result type of an implicit conversion must be more specific than AnyRef
Array[AnyRef](1, "Str1", 'a')
我知道编译器期望我应该明确我的类型,但我没有看到任何其他方式来使其兼容。有什么想法吗?
问题是 1
它们是 AnyVal
而不是 AnyRef
因此隐式转换发生在幕后。
您可以使用 Int.box(1)
创建 java.lang.Integer
但是,装箱仍然会在运行时发生,因此您只是添加样板文件,您可以尝试查看 List[Array[Any]]
是否按预期编译和工作。