This is my very first question down here, so i'll try to make it clear as far as i can.
Other error: type mismatch;
questions here are not related to this error.
I have this odd problem with scala/java inter-operability :
Let's suppose we have a Java class
public class JavaClass{
public static <T> T[] toArray(Class<T> t, Collection<T> coll) {
return null; // return null to make it simple
}
}
And then i have another Scala class i just wanted to wrap this method in :
object ScalaClass{
def toArray[T](t: java.lang.Class[T], coll: java.util.Collection[T]): Array[T] = {
JavaClass.toArray[T](t, coll);
}
}
compiling the Scala class gives me a very odd error :
error: type mismatch;
Any idea is appreciated.
EDIT 1: The full error message is
[ERROR] ScalaScala.scala:4002: error: type mismatch;
[INFO] found : Array[T]
[INFO] required: Class[T]
[INFO] JavaClass.toArray[T](t, coll);
[INFO] ^
Welcome to SO.
This seems to compile, but I am not sure if it works with the real implementation of JavaClass, but I am pretty sure it should.
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)
}
To call it from Scala you just need to pass the java collection, it would get the correct class from the type, like this:
val col: java.util.Collection[String] = ???
val array: Array[String] = ScalaClass.toArray(col)
If you want to preserve the original signature, you have to do this:
object ScalaClass {
def toArray[T <: AnyRef](t: java.lang.Class[T], coll: java.util.Collection[T]): Array[T] =
JavaClass.toArray[T](t, coll)
}
Which you can use like this:
val col: java.util.Collection[String] = ???
val array: Array[String] = ScalaClass.toArray(classOf[String], col)
In both cases the trick is the <: AnyRef
type bound.
IMHO, the first version is more ergonomic to be used on idiomatic Scala code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With