Je vérifie simplement l'égalité des types structurels dans scala.Vérification du type structurel dans scala par isInstanceOf
Je crée une instance foo
à partir d'une classe immédiatement connue et d'un type Q
. Je les ai l'intention de différer avec le nom de la méthode, de sorte qu'en espérant les considérer comme un type différent structurellement.
extrait de code:
scala> val foo = new {def foo=1}
a: AnyRef{def foo: Int} = [email protected]
scala> type Q = {def q:Unit}
defined type alias Q
scala> foo.isInstanceOf[Q]
<console>:14: warning: a pattern match on a refinement type is unchecked
foo.isInstanceOf[Q]
^
res55: Boolean = true
La vérification retourne vrai.
Q1: Je ne comprends pas pourquoi foo
est une instance de Q
. C'est un non-sens. Ne sont-ils pas différents en termes de structure de type?
Q2: Alors, quelle est la manière formelle de vérifier le type structurel?
types de structure sont non codées dans les classes (ce qui est aussi la raison pour laquelle scala utilise la réflexion pour appeler des méthodes déclarées avec « typage structurel » - du point de vue de bytecode Java, ils ne le font pas existe) alors ressemble à Scala compilateur n'a pas pris la peine de créer encore une autre classe, parce que ce serait le même que le premier ... –
aussi vous obtenez un avertissement pour une raison –
la solution la plus évidente est de ne pas vouloir vérifier ces types (pensez comment vous pouvez encoder les informations nécessaires ailleurs) –