Calling Java Generic Typed Method from Scala gives a Type mismatch error : Scala
Calling Java Generic Typed Method from Scala gives a Type mismatch error : Scala
这是我在这里的第一个问题,所以我会尽量把它说清楚。
这里的其他 error: type mismatch;
个问题与此错误无关。
我在 scala/java 互操作性方面遇到了这个奇怪的问题:
假设我们有一个 Java class
public class JavaClass{
public static <T> T[] toArray(Class<T> t, Collection<T> coll) {
return null; // return null to make it simple
}
}
然后我有另一个 Scala class 我只是想把这个方法包装在 :
object ScalaClass{
def toArray[T](t: java.lang.Class[T], coll: java.util.Collection[T]): Array[T] = {
JavaClass.toArray[T](t, coll);
}
}
编译 Scala class 给我一个非常奇怪的错误:
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。
这似乎可以编译,但我不确定它是否适用于 JavaClass 的实际实现,但我很确定它应该。
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)
}
要从 Scala 调用它,您只需传递 java 集合,它将从类型中获取正确的 class,如下所示:
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
类型绑定。
恕我直言,第一个版本更符合人体工程学,可用于惯用的 Scala 代码。
这是我在这里的第一个问题,所以我会尽量把它说清楚。
这里的其他 error: type mismatch;
个问题与此错误无关。
我在 scala/java 互操作性方面遇到了这个奇怪的问题:
假设我们有一个 Java class
public class JavaClass{
public static <T> T[] toArray(Class<T> t, Collection<T> coll) {
return null; // return null to make it simple
}
}
然后我有另一个 Scala class 我只是想把这个方法包装在 :
object ScalaClass{
def toArray[T](t: java.lang.Class[T], coll: java.util.Collection[T]): Array[T] = {
JavaClass.toArray[T](t, coll);
}
}
编译 Scala class 给我一个非常奇怪的错误:
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。
这似乎可以编译,但我不确定它是否适用于 JavaClass 的实际实现,但我很确定它应该。
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)
}
要从 Scala 调用它,您只需传递 java 集合,它将从类型中获取正确的 class,如下所示:
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
类型绑定。
恕我直言,第一个版本更符合人体工程学,可用于惯用的 Scala 代码。