我显然错过了以下为什么不能编译的内容:
trait SomeTrait{
def homepageClass[A <: SomeType]: Class[A]
}
class SomeOtherType extends SomeType
object SomeObject extends SomeTrait{
def homepageClass = classOf[SomeOtherType]
}
答案 0 :(得分:11)
这里的问题是以下两个声明是不同的:
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]
}
答案 1 :(得分:2)
def homepageClass[A <: SomeType]: Class[A]
说“你提供的A
的子类SomeType
,我可以返回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]
}
更新:我可以考虑的解决方案之间有两个不同之处:
存在类型产生与Java通配符相同的字节码(和their major intended use is interoperation with wildcards)。
您可以为抽象类型成员解决方案编写细化类型:
val x: SomeTrait {type A = SomeOtherType} = SomeObject
我认为你不能用于存在类型。
还有其他人吗?