结构类型scala语法定义的实际类是什么?
例如:结构类型scala语法定义的实际类是什么?,scala,Scala,例如: type T = MyClass {def someMethod:String} 这是否意味着编译器要创建trait,比如“trait AnonTrait extensed MyClass{def somethod:String}”?或者它是通过其他编译器机制完成的? 我的问题是,这种类型语法实际上隐藏了什么。它不创建特征,它只是一个类型别名,这意味着每次引用T,实际上就是引用MyClass{def somethod:String}。但是,您可以使用特征覆盖类型声明: trait A
type T = MyClass {def someMethod:String}
这是否意味着编译器要创建trait,比如“trait AnonTrait extensed MyClass{def somethod:String}
”?或者它是通过其他编译器机制完成的?
我的问题是,这种类型语法实际上隐藏了什么。它不创建特征,它只是一个类型别名,这意味着每次引用
T
,实际上就是引用MyClass{def somethod:String}
。但是,您可以使用特征覆盖类型声明:
trait A
class B {
type T <: A
}
class SubB {
trait T extends A
}
trait A
B类{
类型T它并不隐藏类型的创建,基本上它掩盖了在编译时检查结构约束和在运行时调用someMethod的反射
例如,如果您有:
class Foo(t: MyClass {def someMethod:String}) {
def CallSomeMethod = t.someMethod
}
这意味着Foo类的构造函数接受类型为MyClass的t,该类型也有someMethod(someMethod可以通过trait混合到MyClass中)。
你可以:
class MyClass {}
trait WithSomeMethod {def someMethod = "hello"}
然后您可以创建如下Foo:
val mc = new MyClass with WithSomeMethod
val foo = new Foo(mc)
println(foo.CallSomeMethod) // prints "hello"
现在,当您创建new Foo(mc)
时,编译器使用反射来检查mc是否是一个也有somethod的MyClass。实际调用Foo.callsomethod
也通过反射工作
现在(听我说,我要问你的实际问题了…)按照你的做法:
type T = MyClass {def someMethod:String}
只创建了一个类型别名,而不是一个具体的类型。一旦您没有这样定义,您就可以将Foo定义为:
class Foo(t: T) {
def CallSomeMethod = t.someMethod
}
这相当于前面给出的Foo的定义。您刚刚创建了一个别名T,可以在可能使用MyClass{def someMethod:String}的其他地方重用它
。不会生成实际的T类型,并且每当您引用T时,编译器仍然使用反射来检查结构约束是否定义了someMethod,并且仍然基于反射生成代码以调用someMethod。请考虑这一点:类没有结构类型。类的类型始终是类。atrait生成一个接口。一个单例对象的类型也是一个类
结构类型出现在哪里?作为参数和变量的类型
例如,我可以说def(s:{def size:Int})
,或者val r:{def close():Unit}
现在,这些类型如何显示为字节码?与JVM不支持的任何其他类型(如Java自己的泛型)一样,它们被擦除
因此,就其他所有人(即,不是Scala)而言,上面的s
和r
类型是java.lang.Object
对于Scala本身,一些附加信息存储在一个注释中,该注释给出了Scala理解的这些类型的确切信息。我的问题是,这种类型语法实际上隐藏了什么。我的答案是:类型别名。谢谢,所以在java中使用像反射一样慢的结构约束?而trait更好是的,由于反射,结构类型对性能有影响。