电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 和 Scala 如何調用變參

瀏覽:2日期:2022-08-25 16:56:40

Java 和 Scala 都支持變參方法, 寫在最后的位置上,最基本的調用方式也都是一樣的,一個個羅列過去。也可以傳入數組參數,因為變參本質上就是一個數組,就是把 ... 開始位置到最后一個參數都收納到數組中去,所以變參之所以要放在最后的位置上,且一個方法中最多只能有一個變參類型。

這里主要是對比 Scala 對變參方法的調用,基本調用法當然是沒問題的,但是在傳入數組作為變參的參數列表與 Java 相對時就稍有變化了。

另外提一下,如果想傳入 List 作為變參列表,而不是整體作為變參的第一個元素就是調用集合的 toArray() 方法轉換成一個數組傳入。

下面看 Java 中對變參方法的調用,參數列表和數組

public class JavaVarArgs { public static void main(String[] args) { foo('a', 'b', 'c'); foo(new String[]{'d', 'e'}); } public static void foo(String...params) { System.out.println(params + ' : ' + params.length); for(String s: params) { System.out.println(s); } }}

從輸出結果能夠很明白的看出變參 params 實際上就是一個數組

[Ljava.lang.String;@3f91beef : 3abc[Ljava.lang.String;@1a6c5a9e : 2de

我們知道 Scala 和 Java 之間可以互相調用,現在寫一段 Scala 代碼來調用 foo() 方法

object ScalaVarArgs { def main(args: Array[String]) { JavaVarArgs.foo('a', 'b', 'c') // JavaVarArgs.foo(Array[String]('d', 'e')) }}

JavaVarArgs.foo('a', 'b', 'c') 調用沒問題

而 JavaVarArgs.foo(Array[String]('d', 'e')) 會有編譯問題

Type mismatch: expected String, actual Array[String]

Java 在調用變參方法時可以直接傳入相應類型的數組,而 Scala 確不允許這么做了,因它試圖把 Array[String] 整體作為一個元素傳遞給 foo() 方法,而 foo() 要求的元素類型是字符串,所以編譯不過。

而 Scala 這時該如何使得與 Java 調用變參方法時的行為一致呢,那就是在調用時再附加說明:是要把數組中的元素逐個傳遞級變參,寫法

JavaVarArgs.foo(Array[String]('d', 'e') :_*)

這樣的調用輸出就是

[Ljava.lang.String;@7a718e31 : 2de

如果從上面的例子說來,我們的運氣還不錯,因為編譯器告訴了你出現了什么問題。最麻煩的問題總是在能編譯,但運行時詭異的情況。

因為在我本人實際中遭遇到的情形是變參類型是 Object 的方法,形如

public static void foo(Object...params) { System.out.println(params + ' : ' + params.length); for(Object o: params) { System.out.println(o); } }

上面把參數改為 Object...params, 不會改變 Java 傳數組調用它的行為,但卻增加了 Scala 調用它時的排錯難度。

在 Scala 中使用 foo(Array[String]('d', 'e') 調用并沒有編譯錯誤,加入上面的調試代碼才發現,不管傳入多大的數組,總是輸出像

[Ljava.lang.Object;@7814d044 : 1[Ljava.lang.String;@ea25c1

說方法只接收到了一個元素,類型被識別為形參的類型,不過進一步遍歷變參,發現第一個元素是一個字符串數組,所以 Scala 把 Array[String]('d', 'e') 整體作為 params 的第一個元素傳給了 foo() 方法。寫成

foo(Array[String]('d', 'e') : _*)

是為了把數組拆散了傳給 foo() 方法。

起初以為是 Scala 調用 Java 的變參方法需要這么做,后來重新用 Scala 實現下變參方法

def foo(params: AnyRef*) { println(params + ' : ' + params.length) for (s <- params) { println(s) } }

用 Scala 代碼來調用它,傳入數組,如果不想整體作為一個元素時也必須加上 : _* 參數說明,同樣的:

foo(Array[String]('d', 'e') :_*)

在寫這篇之前,我所認定的這是 Scala 調用變參方法的一個缺陷,: _* 似乎是一種默認行為,現在認為這恰恰是 Scala 的一個靈活性所在。Scala 提供了兩種方式來傳遞數組給變參,而為何 Java 不讓數組整體作為變參的一個元素呢,不過 Scala 放開這一特性,當變參為 Object... params 確實放大了 Bug 的出現機率。

以上就是Java 和 Scala 如何調用變參的詳細內容,更多關于Java 和 Scala 調用變參的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 两头忙,井下装载机,伸缩臂装载机,30装载机/铲车,50装载机/铲车厂家_价格-莱州巨浪机械有限公司 | 超声波焊接机_超音波熔接机_超声波塑焊机十大品牌_塑料超声波焊接设备厂家 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 上海深蓝_缠绕机_缠膜机-上海深蓝机械装备有限公司 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 移动机器人产业联盟官网| 振动台-振动试验台-振动冲击台-广东剑乔试验设备有限公司 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 桁架机器人_桁架机械手_上下料机械手_数控车床机械手-苏州清智科技装备制造有限公司 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | 上海网站建设-上海网站制作-上海网站设计-上海做网站公司-咏熠软件 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 隧道窑炉,隧道窑炉厂家-山东艾瑶国际贸易 | 杭州中央空调维修_冷却塔/新风机柜/热水器/锅炉除垢清洗_除垢剂_风机盘管_冷凝器清洗-杭州亿诺能源有限公司 | 磁力反应釜,高压釜,实验室反应釜,高温高压反应釜-威海自控反应釜有限公司 | 大巴租车平台承接包车,通勤班车,巴士租赁业务 - 鸿鸣巴士 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 杭州代理记账费用-公司注销需要多久-公司变更监事_杭州福道财务管理咨询有限公司 | 深圳希玛林顺潮眼科医院(官网)│深圳眼科医院│医保定点│香港希玛林顺潮眼科中心连锁品牌 | 企业微信营销_企业微信服务商_私域流量运营_艾客SCRM官网 | Boden齿轮油泵-ketai齿轮泵-yuken油研-无锡新立液压有限公司 | 垃圾处理设备_餐厨垃圾处理设备_厨余垃圾处理设备_果蔬垃圾处理设备-深圳市三盛环保科技有限公司 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 广东成考网-广东成人高考网| 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 阁楼货架_阁楼平台_仓库仓储设备_重型货架_广州金铁牛货架厂 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | PU树脂_水性聚氨酯树脂_聚氨酯固化剂_聚氨酯树脂厂家_宝景化工 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测| 上海噪音治理公司-专业隔音降噪公司-中广通环保 | 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 齿轮减速电机一体机_蜗轮蜗杆减速马达-德国BOSERL齿轮减速机带电机生产厂家 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 万师讲师网-优质讲师培训师供应商,讲师认证,找讲师来万师 | 建大仁科-温湿度变送器|温湿度传感器|温湿度记录仪_厂家_价格-山东仁科 | 共享雨伞_共享童车_共享轮椅_共享陪护床-共享产品的领先者_有伞科技 |