最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年09月02日 10:02:02   作者:Yanbin  
這篇文章主要介紹了Java 和 Scala 如何調(diào)用變參,幫助大家更好的理解和學(xué)習(xí)Java與Scala,感興趣的朋友可以了解下

Java 和 Scala 都支持變參方法, 寫(xiě)在最后的位置上,最基本的調(diào)用方式也都是一樣的,一個(gè)個(gè)羅列過(guò)去。也可以傳入數(shù)組參數(shù),因?yàn)樽儏⒈举|(zhì)上就是一個(gè)數(shù)組,就是把 ... 開(kāi)始位置到最后一個(gè)參數(shù)都收納到數(shù)組中去,所以變參之所以要放在最后的位置上,且一個(gè)方法中最多只能有一個(gè)變參類(lèi)型。

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

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

下面看 Java 中對(duì)變參方法的調(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);
  }
 }
}

從輸出結(jié)果能夠很明白的看出變參 params 實(shí)際上就是一個(gè)數(shù)組

[Ljava.lang.String;@3f91beef : 3
a
b
c
[Ljava.lang.String;@1a6c5a9e : 2
d
e

我們知道 Scala 和 Java 之間可以互相調(diào)用,現(xiàn)在寫(xiě)一段 Scala 代碼來(lái)調(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)用沒(méi)問(wèn)題

而 JavaVarArgs.foo(Array[String]("d", "e")) 會(huì)有編譯問(wèn)題

Type mismatch: expected String, actual Array[String]

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

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

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

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

[Ljava.lang.String;@7a718e31 : 2
d
e

如果從上面的例子說(shuō)來(lái),我們的運(yùn)氣還不錯(cuò),因?yàn)榫幾g器告訴了你出現(xiàn)了什么問(wèn)題。最麻煩的問(wèn)題總是在能編譯,但運(yùn)行時(shí)詭異的情況。

因?yàn)樵谖冶救藢?shí)際中遭遇到的情形是變參類(lèi)型是 Object 的方法,形如

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

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

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

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

說(shuō)方法只接收到了一個(gè)元素,類(lèi)型被識(shí)別為形參的類(lèi)型,不過(guò)進(jìn)一步遍歷變參,發(fā)現(xiàn)第一個(gè)元素是一個(gè)字符串?dāng)?shù)組,所以 Scala 把 Array[String]("d", "e") 整體作為 params 的第一個(gè)元素傳給了 foo() 方法。寫(xiě)成

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

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

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

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

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

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

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

以上就是Java 和 Scala 如何調(diào)用變參的詳細(xì)內(nèi)容,更多關(guān)于Java 和 Scala 調(diào)用變參的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • redis.clients.jedis.exceptions.JedisAskDataException異常解決

    redis.clients.jedis.exceptions.JedisAskDataException異常解決

    redis.clients.jedis.exceptions.JedisAskDataExceptio異常是在使用Jedis客戶(hù)端與Redis集群交互時(shí)遇到的一種重定向異常,本文就來(lái)介紹一下解決方法,感興趣的可以了解一下
    2024-05-05
  • Sentinel自定義異常的三種實(shí)現(xiàn)方式

    Sentinel自定義異常的三種實(shí)現(xiàn)方式

    Spring Cloud Alibaba Sentinel 是目前主流并開(kāi)源的流量控制和系統(tǒng)保護(hù)組件,Spring Cloud Alibaba Sentinel 有 3 種自定義異常的實(shí)現(xiàn)方式,本文小編將通過(guò)代碼示例給大家詳細(xì)的介紹這三種實(shí)現(xiàn)方式,需要的朋友可以參考下
    2023-11-11
  • Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡(jiǎn)要分析

    Java網(wǎng)絡(luò)編程之IO模型阻塞與非阻塞簡(jiǎn)要分析

    這篇文章主要介紹Java網(wǎng)絡(luò)編程中的IO模型阻塞與非阻塞簡(jiǎn)要分析,文中附有示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Maven根據(jù)不同環(huán)境打包不同配置文件的方法

    Maven根據(jù)不同環(huán)境打包不同配置文件的方法

    這篇文章主要介紹了Maven根據(jù)不同環(huán)境打包不同配置文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • java使用freemarker模板生成html再轉(zhuǎn)為pdf

    java使用freemarker模板生成html再轉(zhuǎn)為pdf

    這篇文章主要為大家詳細(xì)介紹了java如何使用freemarker模板生成html,再利用iText將生成的HTML轉(zhuǎn)換為PDF文件,感興趣的小伙伴可以參考下
    2025-04-04
  • spring mvc路徑匹配原則詳解

    spring mvc路徑匹配原則詳解

    這篇文章主要介紹了spring mvc路徑匹配原則詳解,小編覺(jué)得還是挺不錯(cuò)的,這里分享給大家,需要的朋友可以參考下,下面就和小編一起來(lái)看看吧
    2018-02-02
  • Java 類(lèi)與對(duì)象超基礎(chǔ)講解

    Java 類(lèi)與對(duì)象超基礎(chǔ)講解

    類(lèi)(class)和對(duì)象(object)是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱(chēng)。對(duì)象是對(duì)客觀(guān)事物的抽象,類(lèi)是對(duì)對(duì)象的抽象。類(lèi)是一種抽象的數(shù)據(jù)類(lèi)型
    2022-03-03
  • Java代碼中4種字符串拼接方式分析

    Java代碼中4種字符串拼接方式分析

    本文主要介紹了Java代碼中4種字符串拼接方式分析,主要介紹了“+”號(hào)、StringBuilder、StringJoiner、String#join,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Spring Cloud Gateway + Nacos 實(shí)現(xiàn)動(dòng)態(tài)路由

    Spring Cloud Gateway + Nacos 實(shí)現(xiàn)動(dòng)態(tài)路由

    這篇文章主要介紹了Spring Cloud Gateway + Nacos 實(shí)現(xiàn)動(dòng)態(tài)路由的方法,幫助大家實(shí)現(xiàn)路由信息的自動(dòng)更新,感興趣的朋友可以了解下
    2020-10-10
  • 養(yǎng)成良好java代碼編碼規(guī)范

    養(yǎng)成良好java代碼編碼規(guī)范

    這篇文章主要介紹了如何養(yǎng)成良好java代碼編碼規(guī)范,規(guī)范需要平時(shí)編碼過(guò)程中注意,是一個(gè)慢慢養(yǎng)成的好習(xí)慣,下面小編就帶大家來(lái)一起詳細(xì)了解一下吧
    2019-06-06

最新評(píng)論

南康市| 吴堡县| 买车| 成武县| 天津市| 师宗县| 罗甸县| 石城县| 嘉峪关市| 修文县| 屯门区| 枣阳市| 深圳市| 碌曲县| 砚山县| 西贡区| 如东县| 龙南县| 瑞安市| 东乌珠穆沁旗| 彩票| 会同县| 简阳市| 桑日县| 滦南县| 桃江县| 临泉县| 延庆县| 嘉黎县| 定兴县| 盐城市| 九江县| 黎城县| 诸暨市| 红原县| 青龙| 赞皇县| 邵武市| 辉县市| 萨迦县| 鲁甸县|