gpt4 book ai didi

java - 从 Scala 调用 Java Generic Typed Method 会出现类型不匹配错误 : Scala

转载 作者:行者123 更新时间:2023-12-04 15:28:49 26 4
gpt4 key购买 nike

这是我在这里的第一个问题,所以我会尽我所能说清楚。
其他 error: type mismatch;这里的问题与此错误无关。

我对 scala/java 互操作性有这个奇怪的问题:

假设我们有一个 Java 类

public class JavaClass{
public static <T> T[] toArray(Class<T> t, Collection<T> coll) {
return null; // return null to make it simple
}
}

然后我有另一个 Scala 类,我只想将这个方法包装在:
object ScalaClass{
def toArray[T](t: java.lang.Class[T], coll: java.util.Collection[T]): Array[T] = {
JavaClass.toArray[T](t, coll);
}
}

编译 Scala 类给了我一个非常奇怪的错误:
error: type mismatch;

任何想法都值得赞赏。

编辑1:
完整的错误信息是
[ERROR] ScalaScala.scala:4002: error: type mismatch;
[INFO] found : Array[T]
[INFO] required: Class[T]
[INFO] JavaClass.toArray[T](t, coll);
[INFO] ^

最佳答案

欢迎来到 SO。

这似乎可以编译,但我不确定它是否适用于 的实际实现Java类 ,但我很确定它应该。

import scala.reflect.ClassTag

object ScalaClass {
def toArray[T <: AnyRef](coll: java.util.Collection[T])(implicit ct: ClassTag[T]): Array[T] =
JavaClass.toArray[T](ct.runtimeClass.asInstanceOf[Class[T]], coll)
}

调用电话斯卡拉 您只需要传递 java 集合,它就会从类型中获取正确的类,如下所示:
val col: java.util.Collection[String] = ???

val array: Array[String] = ScalaClass.toArray(col)

编辑

如果要保留原始签名,则必须这样做:
object ScalaClass {
def toArray[T <: AnyRef](t: java.lang.Class[T], coll: java.util.Collection[T]): Array[T] =
JavaClass.toArray[T](t, coll)
}

您可以像这样使用它:
val col: java.util.Collection[String] = ???

val array: Array[String] = ScalaClass.toArray(classOf[String], col)

在这两种情况下,诀窍都是 <: AnyRef 类型绑定(bind) .
恕我直言,第一个版本更符合人体工程学,可用于惯用的 Scala 代码。

关于java - 从 Scala 调用 Java Generic Typed Method 会出现类型不匹配错误 : Scala,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59393513/

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