2012-06-17 9 views
5

Me preguntaba, ¿por qué AnyVal no se puede usar en un cheque de isInstanceOf? ¿Cuál es la razón detrás de este comportamiento?¿Por qué AnyVal no se puede utilizar en un cheque de instancia de verificación?

scala> val c = 't' 
c: Char = t 

scala> c.isInstanceOf[AnyVal] 
<console>:12: error: type AnyVal cannot be used in a type pattern or isInstanceO 
f test 
      c.isInstanceOf[AnyVal] 
+0

Relacionados: http://stackoverflow.com/questions/10416658 –

+0

Supongo que esto también está relacionado http://www.scala-lang.org/node/3271 –

+0

posible duplicado de [Cómo probar un valor en ¿ser AnyVal?] (http://stackoverflow.com/questions/10416658/how-to-test-a-value-on-being-anyval) –

Respuesta

11

AnyVal ya no existe en tiempo de ejecución. Solo en tiempo de compilación. En otras palabras, es solo un "truco" de compilación considerar las primitivas JVM como objetos de primera clase.

Sin embargo, el método isInstanceOf se ejecuta en tiempo de ejecución, por lo que no puede funcionar. De ahí el error del compilador.

+0

No estoy seguro de si esto es feo o agradable. –

+1

Bueno, 'isInstanceOf' se considera feo en Scala ;-) Debe confiar en el sistema de tipos para obtener ese tipo de información en tiempo de compilación. – paradigmatic

+0

Probablemente estoy siendo muy grueso, pero no entiendo la lógica de esta respuesta. En general, no se permiten los métodos booleanos solo porque la respuesta siempre es "falsa". Y '1.isInstanceOf [Int]' funciona bien ... Y las respuestas al "duplicado" vinculado muestran que dicho método es posible en tiempo de ejecución. –

Cuestiones relacionadas