结构类型

dvi*_*gal 1 scala

我发现自我是一个非常有趣的事实.例如我写道:

type A = { val st: Set[Any]
           val start: Set[Any]
           val Sigma : Set[Char]
           def tr(f: (Tuple2[Any, Any])=>Boolean): Set[Any]
             }
class Fon {
          val st: Set[Any]
          val start: Set[Any]
          val Sigma : Set[Char]
          def tr(f: (Tuple2[Any, Any])=>Boolean): Set[Any] = Set(out)
          def out: String = "is just example"
}
val a: A = new Fon
a.tr(f(Tuple2('a',0)))
Run Code Online (Sandbox Code Playgroud)

但是,如果我会尝试调用a.out - 我得到一个错误,A类型不存在'out'发生了什么,这是如何工作的?谢谢.

And*_*yle 5

A.out由于您已经定义了A类型,因此没有这样的方法.因此,当您尝试调用out对类型对象调用的方法时A,编译器会正确地告诉您不存在此类方法.

顺便说一句,这与结构类型无关 - 如果你已经制作A了一个特性并且已经Fon扩展了它,那么你会遇到完全相同的问题.而且,这就是静态类型系统的工作原理 - 编译器无法保证您的代码是类型安全的,因此它不会编译它.

如果要调用该out方法,则需要通过Fon变量引用该对象:

val a: Fon = new Fon
println(a.out) // works fine, since a is guaranteed to be a Fon and thus have the method
Run Code Online (Sandbox Code Playgroud)