我显然失去了一些东西,为什么以下不会编译:什么是斯卡拉的声明“类<?延伸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