1

scala で構造型の等価性をチェックしているだけです。

fooすぐに無名クラスと type からインスタンスを作成しますQ。メソッド名で区別するつもりなので、構造的に別の型として扱ってほしい。

コードスニペット:

scala> val foo = new {def foo=1}
a: AnyRef{def foo: Int} = $anon$1@3885c37f

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

チェックは true を返します。

Q1:fooが のインスタンスである理由が わかりませんQ。それはナンセンスです。型構造の意味が違うのではないですか?

Q2: では、構造型を確認する正式な方法は何ですか?

4

1 に答える 1

1

isInstanceOfクラス情報による。あなたの場合、型情報が必要です:

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

scala> val foo = new {def foo=1}
foo: AnyRef{def foo: Int} = $anon$1@15ab47

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
于 2014-06-10T06:34:31.053 に答える