類型的註釋可以隨時補充說:
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