2014-06-10 1 views
1

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?

+2

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 ... –

+2

aussi vous obtenez un avertissement pour une raison –

+0

la solution la plus évidente est de ne pas vouloir vérifier ces types (pensez comment vous pouvez encoder les informations nécessaires ailleurs) –

Répondre

1

isInstanceOf est selon l'information de classe. Dans votre cas, vous devez taper info:

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> val foo = new {def foo=1} 
foo: AnyRef{def foo: Int} = [email protected] 

scala> type Q = {def q:Unit} 
defined type alias Q 

scala> def getType[T : TypeTag](t: T) = implicitly[TypeTag[T]].tpe 
getType: [T](t: T)(implicit evidence$1:reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.Type 

scala> getType(foo) =:= typeOf[Q] 
res9: Boolean = false 
+0

merci pour l'information.Je ne suis pas familier avec la réflexion scala. Est-ce que Scala diffère le "Type" à "Class" ?? J'ai trouvé que la réflexion sur les scala les traite différemment, je suis confus parce que la classe de Java est vraiment un type. –

+0

'Type' dans scala est plus strict que' Class'. Par exemple, 'List [Int]' et 'List [Double]' sont de type différent mais de même classe (effacement de type jvm comme vous le savez). – cloud

Questions connexes