Comment distinguer les types paramétriques?

Sep 22 2020

Je suis confus au sujet des sous-types de Scala. Ma grande question est de savoir comment distinguer C[T1]de C[T2]. Il existe deux scénarios:

  1. C[T1]"égal" C[T2]car ce sont tous des sous-types de C.
  2. C[T1]n'est pas «égal» C[T2]parce que C[T1]et C[T2]sont finalement de types différents.

J'ai essayé des moyens comme .getClass, semble que cette stratégie ne fonctionnera pas parce que nous avons des types primitifs.

println(List[Int](1).getClass == List[Double](1.0).getClass) // True
println(List[Int](1).getClass.getCanonicalName) // scala.collection.immutable.$colon$colon
println(Array[Int](1).getClass == Array[Double](1.0).getClass) // False
println(Array[Int](1).getClass.getCanonicalName) // int[]

Je me demande maintenant si je peux faire ça?

Réponses

4 DmytroMitin Sep 22 2020 at 18:05

List[Int]et List[Double]ont la même classe , mais des types différents .

import scala.reflect.runtime.universe._

println(typeOf[List[Int]] =:= typeOf[List[Double]])//false
println(typeOf[List[Int]].typeConstructor =:= typeOf[List[Double]].typeConstructor)//true
println(typeOf[List[Int]])//List[Int]
println(showRaw(typeOf[List[Int]]))//TypeRef(SingleType(SingleType(ThisType(<root>), scala), scala.package), TypeName("List"), List(TypeRef(ThisType(scala), scala.Int, List())))

println(classOf[List[Int]] == classOf[List[Double]])//true
println(classOf[List[Int]])//class scala.collection.immutable.List
println(classOf[List[Int]].getCanonicalName)//scala.collection.immutable.List

Array[Int]et Array[Double]ont des classes et des types différents.

println(typeOf[Array[Int]] =:= typeOf[Array[Double]])//false
println(typeOf[Array[Int]].typeConstructor =:= typeOf[Array[Double]].typeConstructor)//true
println(typeOf[Array[Int]])//Array[Int]
println(showRaw(typeOf[Array[Int]]))//TypeRef(ThisType(scala), scala.Array, List(TypeRef(ThisType(scala), scala.Int, List())))

println(classOf[Array[Int]] == classOf[Array[Double]])//false
println(classOf[Array[Int]])//class [I
println(classOf[Array[Int]].getCanonicalName)//int[]

https://docs.scala-lang.org/overviews/reflection/overview.html

https://typelevel.org/blog/2017/02/13/more-types-than-classes.html

Effacement de type dans Scala

C[T1]"égal" C[T2]car ce sont tous des sous-types de C.

Ce ne sont pas des sous-types .

https://www.scala-lang.org/files/archive/spec/2.13/03-types.html#conformance

Sous-type dans Scala: qu'est-ce que "type X <: Y"?