簡體   English   中英

Scala中奇怪的isInstanceOf行為

[英]odd isInstanceOf behavior in Scala

使用ScalaTest / FlatSpec庫,我正在使用功能狀態測試隨機數生成器的返回值類型:

it should "return (\"{someRandomNumber}\", rng2) on nonNegativeInt.map(_.toString)" in {
    val s = RNG.map(RNG.nonNegativeInt)(_.toString)(rng)
    assert(s.isInstanceOf[(Int, RNG)]) // WRONG but PASS!!
    assert(s._2 !== rng)
}

現在,如果您注意到不正確的isInstanceOf[(Int, RNG)]您會認為這會導致失敗,但是會成功。

下面的代碼演示只要元組具有正確的Arity,就可以通過:

it should "not work" in {
    assert(("123", rng).isInstanceOf[(Int, RNG)]) // PASS
    assert(("123", rng).isInstanceOf[(String, Nothing)]) // PASS
    assert(("123", rng).isInstanceOf[(Exception, Array[_])]) // PASS
}

但是如果元組具有一個類型參數:

it should "also not work" in {
    assert(("123").isInstanceOf[Int]) // FAIL
}

這里發生了什么? 我應該如何測試內部參數化類型?

永遠不要忘記scala由純舊的Java支持,繼承了它的所有細微差別。 Java對泛型類執行運行時類型擦除 因此,您在運行時的(Int, Rng)Tuple2(Object, Object) ,您的s也是如此。

您可以在此處找到一些有用的信息,如何在scala中解決該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM