簡體   English   中英

Scala:為什么asInstanceOf可以接受類型參數但isInstanceOf不能接受?

[英]Scala: Why asInstanceOf can accept a type parameter but isInstanceOf can not?

這是REPL中的人為實驗(scala 2.11):

scala> class Foo[T] {
     |   def as(x: Any) = x.asInstanceOf[T]
     | }

defined class Foo

scala> val foo = new Foo[String]
foo: Foo[String] = Foo@65ae6ba4

scala> val x: Any = 123
x: Any = 123

scala> foo.as(x)  // expected
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
  ... 33 elided

scala> val y: Any = "abc"
y: Any = abc

scala> foo.as(y)
res1: String = abc


scala> class Bar[T] {
     |   def is(x: Any) = x.isInstanceOf[T]
     | }

<console>:12: warning: abstract type T is unchecked since it is eliminated by erasure
         def is(x: Any) = x.isInstanceOf[T]
                                        ^
defined class Bar

scala> val bar = new Bar[String]
foo: Foo[String] = Foo@1753acfe

scala> val x: Any = 123
x: Any = 123

scala> bar.is(x)  // unexpected
res2: Boolean = true

scala> val y: Any = "abc"
y: Any = abc

scala> bar.is(y)
res3: Boolean = true

我知道類型參數由於類型擦除而非常有限,但仍然被asInstanceOf和isInstanceOf之間的不同行為所困惑。

想知道是否有人對此有任何見解? 謝謝!

嗯,您必須知道,類型參數在運行時不可用,它們攜帶的所有信息只能由編譯器使用。 現在, asInstanceOf只是一個強制轉換,只需要編譯器強制執行類型兼容性,並且在運行時它根本不做任何事情:引用是關於底層對象類型的引用。

另一方面, isInstanceOf則相反:編譯器對它一無所知,它只是一個函數調用。 它在運行時執行以檢查給定對象是否是預期類型。 但是類型參數在運行時不可用,那么它如何知道要檢查哪種類型? 因此,它需要一個真正的Class參數。

暫無
暫無

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

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