结构类型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更好是的,由于反射,结构类型对性能有影响。