Это не скрывает создание типа.В основном он маскирует использование отражения для проверки ваших структурных ограничений во время компиляции и для вызова someMethod во время выполнения.
Например, если у вас есть:
class Foo(t: MyClass {def someMethod:String}) {
def CallSomeMethod = t.someMethod
}
, это означает конструктор для вашего Fooкласс принимает в типе MyClass, который также имеет someMethod (где someMethod может быть смешан с 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 является MyClassу этого также есть некоторый метод.Фактический вызов foo.CallSomeMethod
также работает через отражение.
Теперь (потерпите меня, я перехожу к вашему актуальному вопросу ...), действуя так, как вы:
type T = MyClass {def someMethod:String}
создает только псевдоним типа, а не конкретный тип.Как только вы определили T таким образом, вы можете определить Foo как:
class Foo(t: T) {
def CallSomeMethod = t.someMethod
}
, что эквивалентно определению Foo, данному ранее.Вы только что создали псевдоним T, который можно использовать в других местах, где вы могли использовать MyClass {def someMethod:String}
.Фактический тип T не генерируется, и компилятор по-прежнему использует отражение всякий раз, когда вы ссылаетесь на T, чтобы проверить структурное ограничение, определившее someMethod, и по-прежнему генерирует код на основе отражения, чтобы вызвать someMethod.