类型的注释可以随时补充说:
var server: TraitOrInterface = null
然而,由于瓦尔有点恶心......
val server = if (cond) {
new Server1()
} else {
new Server2()
}
在第二个例子中,斯卡拉应该能够统一类型。 (我相当肯定,有些情况是无法统一的 - 或者它没有统一到需要的地方,但是在返回到注释类型之前给它一个注释,可以按照第一个例子添加注释。)
REPL示范:
class X
trait Y
class A extends X with Y {}
class B extends X with Y {}
val uni = if (true) new A() else new B()
uni
>> res3: X with Y = [email protected]
编码愉快。
结构打字例如,type
别名是为了方便,但在技术上不是必需的。
class Cat { def speak() = "meow" }
class Dog { def speak() = "woof" }
type ThingThatSpeaks = { def speak(): String }
val speaker : ThingThatSpeaks = if (true /* smart */) new Cat() else new Dog()
speaker
>> res4: ThingThatSpeaks = [email protected]
speaker.speak()
>> res5: String = meow
注意,被要求类型标注,否则......
val speaker = if (true /* smart */) new Cat() else new Dog()
speaker
>> res6: ScalaObject = [email protected]
speaker.speak()
>> error: value speak is not a member of ScalaObject
,如果它不是一个共同的特点,但偶然相同的方法名称? (是的,这是废话 - 但以防万一) – parsa 2011-06-15 08:28:25
@parsa然后你可以使用[结构打字](http://codemonkeyism.com/scala-goodness-structural-typing/):-) – 2011-06-15 08:31:40
@parsa我添加了一个例子利用结构分型。 – 2011-06-15 08:39:50