欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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("")



当然,用as.mkString("")是可以的

转载于:https://my.oschina.net/magicly007/blog/359543