scala中的type
只是一个语法糖,在编译时就像一个宏,或者还有其他魔法吗?在这种情况下:
type Bar1 = Foo
type Bar2 = Foo
val bar1 = injector.getInstance(classOf[Bar1])
val bar2 = injector.getInstance(classOf[Bar2])
DI容器能否区分两个'类型别名'?
答案 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
是相同的。