我顯然失去了一些東西,爲什麼以下不會編譯:什麼是斯卡拉的聲明「類<?延伸SOMETYPE>」
trait SomeTrait{
def homepageClass[A <: SomeType]: Class[A]
}
class SomeOtherType extends SomeType
object SomeObject extends SomeTrait{
def homepageClass = classOf[SomeOtherType]
}
我顯然失去了一些東西,爲什麼以下不會編譯:什麼是斯卡拉的聲明「類<?延伸SOMETYPE>」
trait SomeTrait{
def homepageClass[A <: SomeType]: Class[A]
}
class SomeOtherType extends SomeType
object SomeObject extends SomeTrait{
def homepageClass = classOf[SomeOtherType]
}
這裏的問題是,下面的兩個聲明都不同:
def homepageClass[A <: SomeType]: Class[A] // has type parameters
def homepageClass = classOf[SomeOtherType] // doesn't have type parameters
來完成你需要聲明一個抽象類型,這樣你想要的東西:
trait SomeTrait{
type A <: SomeType
def homepageClass: Class[A]
}
object SomeObject extends SomeTrait {
type A = SomeOtherType
def homepageClass: Class[A] = classOf[SomeOtherType]
}
或者
trait SomeTrait[A <: SomeType] {
def homepageClass: Class[A]
}
object SomeObject extends SomeTrait[SomeOtherType] {
def homepageClass: Class[SomeOtherType] = classOf[SomeOtherType]
}
def homepageClass[A <: SomeType]: Class[A]
說:「不管的SomeType
你給子類A
,我可以返回一個Class[A]
。特別是,它可以被稱爲是這樣的:
class SomeThirdType extends SomeType
val x: Class[SomeThirdType] = SomeObject.homepageClass[SomeThirdType]
更直接等同比丹尼爾給人是一種存在類型:
trait SomeTrait{
def homepageClass: Class[A forSome {type A <: SomeType}]
}
或
trait SomeTrait{
def homepageClass: Class[_ <: SomeType]
}
UPDATE:有兩種解決方案之間的差異我可以想想:
存在類型產生與Java通配符(和their major intended use is interoperation with wildcards)相同的字節碼。
你可以寫抽象類型成員的解決方案細化類型:
val x: SomeTrait {type A = SomeOtherType} = SomeObject
我不認爲你可以對存在的類型。
其他?
如果你現在解釋我的建議和存在型版本之間的區別,那會很棒! :-) – 2010-06-21 18:26:00