Je passe par drmacvier blog sur les types existentiels dans Scala. Après l'avoir lu, j'expérimentais avec les types et je vérifie l'égalité des types de la manière suivante, comme indiqué dans le blog rnduja.Type de T forSome {type T}
def implicitly[A](implicit a: A) = a
// To check equality of two types
class =:=[A, B]
implicit def equalTypeInstance[A] = new =:=[A, A]
def type_==[A, B](implicit ev: A =:= B = null) = ev != null
// To check subtype relation between two types
class <:<[-A, +B]
implicit def subTypeInstance[A] = new <:<[A, A]
def type_<[A, B](implicit ev: A <:< B = null) = ev != null
La première que j'ai vérifié était cette chose:
type_==[Any, T forSome{type T}] // true
ce que je ne pouvais pas comprendre est T forSome{type T}
est satisfaite par tout type mais pourquoi est son type Any
. En supposant, puisque Any
est un ancêtre commun de tous les types possibles, il est logique qu'ils soient égaux. De la même manière, j'étais capable de raisonner.
type_==[Array[Any], Array[T forSome{type T}]] // true
type_==[List[Any], List[T forSome{type T}]] // true
Je n'ai pas réussi à obtenir ce droit avec le même raisonnement.
type_==[Array[Any], (Array[T] forSome{type T})] // false
type_==[List[Any], (List[T] forSome{type T})] // true
Que manque-t-il ici? Est-ce que mon raisonnement est défectueux?
Probablement parce que List est covariant et Array est invariant? –