如何在Scala中实现`type`关键字

时间:2017-01-24 10:26:08

标签: scala types dependency-injection

scala中的type只是一个语法糖,在编译时就像一个宏,或者还有其他魔法吗?在这种情况下:

type Bar1 = Foo
type Bar2 = Foo
val bar1 = injector.getInstance(classOf[Bar1])
val bar2 = injector.getInstance(classOf[Bar2])

DI容器能否区分两个'类型别名'?

2 个答案:

答案 0 :(得分:1)

只是语法糖为同一类型指定了不同的名称。编译器不生成新类型,因此无法区分相同类型的类型别名或原始类型。例如:

type Foo = String
def foo(f:Foo)
val s : String = "bar"
foo(s)

编译得很好。

同样地,DI容器将无法区分您在运行时显示的两种情况,因为在编译时从未有过两种不同的类型。

答案 1 :(得分:1)

我认为使用Scala反射和宏的DI容器可以区分它们(虽然classOf在这种情况下没有意义),但可能不应该:它会违反最不惊讶的原则相当强烈。更有用的是,它可以区分List[Apple]List[Orange],尽管它们classOf是相同的。