av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

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

Java 和 Scala 如何調(diào)用變參

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

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

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

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

下面看 Java 中對變參方法的調(diào)用,參數(shù)列表和數(shù)組

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 實際上就是一個數(shù)組

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

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

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

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

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

Type mismatch: expected String, actual Array[String]

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

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

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

這樣的調(diào)用輸出就是

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

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

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

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

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

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

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

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

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

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

起初以為是 Scala 調(diào)用 Java 的變參方法需要這么做,后來重新用 Scala 實現(xiàn)下變參方法

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

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

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

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

以上就是Java 和 Scala 如何調(diào)用變參的詳細內(nèi)容,更多關于Java 和 Scala 調(diào)用變參的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 天天干天天弄 | av网在线观看 | 日韩视频在线播放 | 一级毛片在线看 | 亚洲综合三区 | 激情五月综合 | 日韩成人片 | 日韩三级大片 | 黄色片久久 | 亚洲成人av在线播放 | 影音先锋国产精品 | 黄色大片在线 | 日韩黄视频 | 日韩欧美在线看 | 伊人精品视频 | 亚洲综合二区 | 一区二区不卡视频 | 日韩和的一区二区 | 免费一区| 国产一区二区在线视频 | 亚洲 欧美 另类 综合 偷拍 | 精品国产91 | 免费看片黄色 | 日本国产在线观看 | 中文在线观看免费网站 | 五月婷婷丁香花 | 精品久久久久久 | 国产美女视频 | 免费观看成人 | 可以看的毛片 | 中文字幕av久久爽一区 | 一区中文字幕 | 成人深夜视频 | 国产小视频在线播放 | 色婷婷国产 | 亚洲欧美网站 | 精品久久久久久久久久久久久久 | 精品一区二区三区免费毛片 | 亚洲精品不卡 | 小sao货撅起屁股扒开c微博 | 日韩精品视频一区二区三区 |