例:
type T = MyClass {def someMethod:String}
Run Code Online (Sandbox Code Playgroud)
它是否意味着编译器创建像" trait AnonTrait extends MyClass {def someMethod:String}" 这样的特征?或者它是通过其他编译器机制完成的?我的问题是这种Type语法实际上隐藏了什么.
它不隐藏类型的创建。基本上,它掩盖了使用反射来在编译时检查结构约束并在运行时调用 someMethod。
例如,如果您有:
class Foo(t: MyClass {def someMethod:String}) {
def CallSomeMethod = t.someMethod
}
Run Code Online (Sandbox Code Playgroud)
这意味着 Foo 类的构造函数接受 MyClass 类型的 at ,该类型也具有 someMethod (其中 someMethod 可以通过特征混合到 MyClass 中)。你可以有:
class MyClass {}
trait WithSomeMethod {def someMethod = "hello"}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样创建 Foo :
val mc = new MyClass with WithSomeMethod
val foo = new Foo(mc)
println(foo.CallSomeMethod) // prints "hello"
Run Code Online (Sandbox Code Playgroud)
现在,当您创建new Foo(mc)编译器时,它会使用反射来检查 mc 是否是一个 MyClass,它也有一个 someMethod。实际的调用foo.CallSomeMethod也通过反射进行。
现在(请耐心等待,我正在回答您的实际问题......)按照您的做法:
type T = MyClass {def someMethod:String}
Run Code Online (Sandbox Code Playgroud)
仅创建类型别名,而不是具体类型。一旦你以这种方式定义了 T,你就可以将 Foo 定义为:
class Foo(t: T) {
def CallSomeMethod = t.someMethod
}
Run Code Online (Sandbox Code Playgroud)
这相当于前面给出的 Foo 的定义。您刚刚创建了一个别名 T,可以在您可能使用过的其他地方重用该别名MyClass {def someMethod:String}。不会生成实际的 T 类型,并且每当您引用 T 时,编译器仍然使用反射来检查它确实定义了 someMethod 的结构约束,并且仍然基于反射生成代码来调用 someMethod。
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |