很多朋友对于Scala与Java:函数变参调用的差异解析和不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
一个例子
导入com.alibaba.fastjson.JSON
对象测试{
def main(args: 数组[字符串])={
val map=new util.HashMap[CharSequence, CharSequence]()
地图.put("123", "22333")
map.put("测试", null)
val ret=JSON.toJSONString(map)
打印(返回)
}
}如上所示,这个例子很简单,将java的map转换成json字符串。
JSON.toJSONString的代码如下:
公共静态字符串toJSONString(对象对象){
return toJSONString(object,emptyFilters,new SerializerFeature[0]);
}
公共静态字符串toJSONString(对象对象,SerializerFeature.功能){
返回JSONString(对象, DEFAULT_GENERATE_FEATURE, 功能);
}问题就在这里,上面的测试用例报错:
对重载定义的引用不明确,对象JSON 中的两个方法toJSONString
类型(x$1: 任意,x$2: com.alibaba.fastjson.serializer.SerializerFeature*)String
和对象JSON 中的方法toJSONString
类型(x$1: 任意)字符串
匹配参数类型(java.util.HashMap[CharSequence,CharSequence])
val ret=JSON.toJSONString(map) 错误的原因很明显。编译器在编译scala并调用java依赖包中的toJSONString函数时存在二义性。
scala含有变参的重载函数
看一段代码:
对象Foo {
def apply (x1: Int): Int=2
def apply (x1: Int, x2: Int*): Int=3
def apply (x1: Int*): Int=4
}
对象Test11 扩展App {
控制台println Foo(7)
控制台println Foo(2, Array(3).toSeq: _*)
控制台println Foo(Array(3, 4).toSeq: _*)
}以上代码分别输出:2,3,4
对于前两个构造函数,与文章开头的例子相对应,说明scala调用类似的scala依赖是没有问题的。
我们来关注一下scala 是如何调用可变参数的:当用Foo(2, 3) 调用时,会出现歧义,因为(2, 3) 可以匹配第二个和第三个构造函数。所以,我们只能用Foo(2, Array(3).toSeq: _*)这种看起来很奇怪的写法来区分。 Array(3).toSeq: _* 告诉编译器这个参数是变量,所以不要匹配错误。
那么,我们来看看Java是如何做到的。
java含有变参的重载函数
我不会写代码。总之,在Java中调用类似Java的函数是没有问题的。
那么问题来了,为什么scala在调用java中类似的函数时会出现问题呢?要回答这个问题,我们首先来看看当Java进行重载调用时编译器会做什么?
调用方法时,如果既能匹配定参函数又能匹配可变参数,则优先调用定参方法。调用方法时,如果两个变长参数匹配,则编译失败。公共类VariVargsTest2 {
公共静态无效主(字符串[] args){
测试("你好"); //1
}
公共静态无效测试(字符串.args)
{
System.out.println("变长参数1");
}
公共静态无效测试(字符串字符串,字符串.args)
{
System.out.println("变长参数2");
}
}没有代码时,程序可以编译通过。但是当添加一段代码时,无法编译,给出的错误是:The method test(String[]) is ambigacy for the type VariVargsTest2.编译器不知道选择哪种方法。
总结
从scala和java处理包含可变参数的重载函数的方式,我们可以知道为什么文章开头的代码无法编译通过。
【Scala与Java:函数变参调用的差异解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
Scala 和 Java 的区别真的不少哦,以前不太了解变参调用。
有6位网友表示赞同!
原来 scala 可以直接用变参调用,感觉好方便!
有11位网友表示赞同!
学习一下scala的变参调用,看看能不能提高我的开发效率。
有7位网友表示赞同!
Java 之前也没见过这种函数定义方式,还挺新奇的。
有15位网友表示赞同!
看了下语法,Scala 的变参调用比 Java 简洁很多。
有11位网友表示赞同!
这样子的话,写代码的时候是不是就更灵活了?
有15位网友表示赞同!
希望我以后能用上scala的变参调用,看看实际效果。
有20位网友表示赞同!
原来 scala 可以处理不同数量的参数功能函数,太棒了!
有13位网友表示赞同!
学习一下 scal的这个特性,看能不能用到 my 代码中。
有15位网友表示赞同!
这种方法会不会比较消耗资源呢? Java 的方式更稳妥吗?
有14位网友表示赞同!
感觉 Scala 的这部分设计确实挺巧妙的。
有17位网友表示赞同!
我平时用的就是 Java,现在看来 scala 真的挺实用的。
有9位网友表示赞同!
如果学习了 scala 的变参调用,对 java 的学习会有帮助吗?
有11位网友表示赞同!
有没有什么好的资源可以学习 scala 的变参调用?
有8位网友表示赞同!
这个特性是不是在其他的语言中也存在?
有7位网友表示赞同!
感觉这种方法能够提高代码的复用性。
有18位网友表示赞同!
scala 真的越来越吸引我了。
有7位网友表示赞同!
这篇文章让我对 scala 的认识又进一步了。
有16位网友表示赞同!
学习新的东西总是一种进步,感谢分享哦
有14位网友表示赞同!
期待看到更多关于 scala 和 java 的比较分析。
有15位网友表示赞同!