中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala怎么匹配自定義泛型類型

發布時間:2021-06-12 11:13:57 來源:億速云 閱讀:264 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“scala怎么匹配自定義泛型類型”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“scala怎么匹配自定義泛型類型”這篇文章吧。

我正在嘗試使用模式匹配來檢測基于   this answer的我自己的自定義類型的泛型類型.

作者提供的代碼按預期工作:

import scala.reflect.runtime.{universe => ru}

def matchList[A: ru.TypeTag](list: List[A]) = list match {  case strlist: List[String @unchecked] if ru.typeOf[A] =:= ru.typeOf[String] => println("A list of strings!")  case intlist: List[Int @unchecked] if ru.typeOf[A] =:= ru.typeOf[Int] => println("A list of ints!")
}

matchList(List("a", "b", "c"))
matchList(List(1,2,3))

正確顯示:

A list of strings!
A list of ints!

現在基于此我試圖應用相同的模式來檢測我的自定義類Foo的泛型類型.下面的代碼是copy-pased,除了它使用Foo而不是List:

import scala.reflect.runtime.{universe => ru}

class Foo[T](val data: T)

def matchFoo[A: ru.TypeTag](foo: Foo[A]) = {
  println("Is string = " + (ru.typeOf[A] =:= ru.typeOf[String]))
  println("Is int = " + (ru.typeOf[A] =:= ru.typeOf[Int]))
  foo match {    case fooStr: Foo[String @unchecked] if ru.typeOf[A] =:= ru.typeOf[String] => println("Found String")    case fooInt: Foo[Int @unchecked] if ru.typeOf[A] =:= ru.typeOf[Int] => println("Found Int")
  }
}

matchFoo(new Foo[String]("str"))
println("------------")
matchFoo(new Foo[Int](123))

只有這次它輸出的不是我所期望的:

Is string = trueIs int = falseFound String
------------
Is string = falseIs int = trueFound String  // wth?

第二個調用matchFoo(new Foo [Int](123))如何顯示Found String?正如你所看到的,我甚至明確地印出了比賽條件,他們很好.

在線代碼:http://goo.gl/b5Ta7h

編輯:

我通過將匹配條件提取到變量中來實現它:

def matchFoo[A: ru.TypeTag](foo: Foo[A]) = {
    val isString: Boolean = ru.typeOf[A] =:= ru.typeOf[String]
    val isInt: Boolean = ru.typeOf[A] =:= ru.typeOf[Int]
    println("Is string = " + isString)
    println("Is int = " + isInt)
    foo match {
      case fooStr: Foo[String @unchecked] if isString => println("Found String")  case fooInt: Foo[Int @unchecked] if isInt => println("Found Int")}
}

在線代碼:http://goo.gl/mLxYY2

但在我看來,原始版本也應該有效.我不認為我在這里缺少運算符優先級,因為將條件包裝到括號中也沒有幫助.

它是Scala中的錯誤嗎?我正在使用Scala SDK v.2.11.5和JDK v.1.8.0_25.在線CodingGround使用Scala SDK v.2.10.3.

編輯2:

我已經在Scala的bugtracker中打開了一個問題.你可以投票支持here.

這看起來非常像編譯器中的一個錯誤,它無法解析正確的隱式(可能是@unchecked的存在?).

case fooStr: Foo[String @unchecked] if ru.typeOf[A] =:= ru.typeOf[String] =>
   println(implicitly[TypeTag[String]]) // will print TypeTag[Int]

通過查看字節代碼,編譯器使用傳遞給方法的TypeTag($evidence).

(有限的)解決方法可能是使用ru.definitions.IntTpe:

case fooStr: Foo[Int @unchecked] if ru.typeOf[A] =:= ru.definitions.IntTpe =>
   println("That's an Int")

以上是“scala怎么匹配自定義泛型類型”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旬邑县| 龙井市| 延吉市| 南澳县| 临洮县| 沅江市| 安阳市| 昌江| 龙山县| 桓仁| 台州市| 米脂县| 徐州市| 长寿区| 北辰区| 哈尔滨市| 辉县市| 田阳县| 宾川县| 偏关县| 江阴市| 孙吴县| 太仓市| 诸暨市| 皮山县| 宁南县| 济源市| 满城县| 中卫市| 建阳市| 高雄县| 利川市| 灵武市| 景德镇市| 金塔县| 昌邑市| 化德县| 南华县| 大田县| 万山特区| 宝坻区|