Scala: как экземпляр Any, также экземпляр Subtypes, Int, Boolean и т. Д. - PullRequest
0 голосов
/ 17 октября 2019
class Parent 
class Child extends Parent

val p = new Parent
val c = new Child

p.isInstanceOf[Parent] // Return true 
p.isInstanceOf[Child] // false, 

c.isInstanceOf[Child] // Return true
c.isInstanceOf[Parent] // true as Child is a subtype of Parent

Итак, у нас выше поведение. Теперь из того, что я читал о Scala еще во времена моего самого Scala, Any - это супертип всех классов. Все типы значений, Int, Boolean, Double и т. Д., Являются подтипами Any .

Таким образом, любое значение подтипов, таких как Int, Boolean и т. Д., Также будет иметь тип Any. Но наоборот не будет правдой.

val i: Int = 10
i.isInstanceOf[Int] // true
i.isInstanceOf[Any] // true

val a: Any = 5
a.isInstanceOf[Any] // true. Everything until now, inline with the Parent, Child example above
a.isInstanceOf[Int] // Returns true as well. How? a is of Any type and Int is a Subtype of Any, then how is a value of Any type, also of type Int.

1 Ответ

0 голосов
/ 17 октября 2019

Когда вы пишете,

val s: String = "a sample string"

У вас есть 3 очень разные вещи,

  1. immutable variable типа String.
  2. An identifier s, который идентифицирует вышеупомянутый variable.
  3. instance типа String, выше variable относится к этому instance как value.

Теперь variable типа A может ссылаться на любой экземпляр типа B, если B является подтипом A.

Итак,если вы напишите,

val a: Any = "another sample string"

Вы получите identifier a, идентифицирующий immutable variable типа Any, ссылающийся на экземпляр типа String.

Итак,если вы отметите a.isInstanceOf[String], вы получите true, потому что экземпляр, на который ссылается a, имеет тип String.

...