Scala和Java的互操作有点坑
程序员文章站
2022-06-14 20:26:23
...
Scala的一大卖点就是与Java的“互操作性”(SEAMLESS JAVA INTEROP),今天就遇到一个小坑。println数组数据的时候,会输出数组地址,Java里面用Arrays.asList(),比如:
import java.util.Arrays;
/**
* Created by magicalli on 2014/12/23.
*/
public class ArrayTest {
public static String[] strs = new String[]{"a", "b", "c"};
public static void main(String[] args) {
System.out.println(strs);
System.out.println(Arrays.asList(strs));
System.out.println(Arrays.asList(Test$.MODULE$.as()));
System.out.println(Arrays.asList((Object[]) new String[][]{ArrayTest.strs}));
}
}
没有问题,然后在scala里面使用,
import java.util
/**
* Created by magicalli on 2014/12/23.
*/
object Test {
val as = Array("a", "b", "c")
def main(args: Array[String]) {
println(as)
println(util.Arrays.asList(as))
println(ArrayTest.strs)
println(util.Arrays.asList(ArrayTest.strs))
println(as.mkString)
as foreach print
}
}
结果输出的全部是数组地址,反编译后,发现scala生成的代码居然是
Predef..MODULE$.println(Arrays.asList((Object[])new String[][] { ArrayTest.strs }));
额,这个如果放在Java里也输出的是地址,因为变成了一个二维数组啊!
最后的解决方法是,scala里能不用Java代码的地方还是尽量不要用。这个小需求的更好的解决方法是,用foreach或者mkString,如前面的scala代码里面。
还有一点要注意的是,as.mkString可以编译通过,而as.mkString()就不过不了,原因是mkString方法在申明的时候就没有带(),所以调用的时候也不能带:
def mkString(start: String, sep: String, end: String): String =
addString(new StringBuilder(), start, sep, end).toString
def mkString(sep: String): String = mkString("", sep, "")
def mkString: String = mkString("")
转载于:https://my.oschina.net/magicly007/blog/359543