什么是Scala声明"Class <?extends SomeType>"

Ale*_*exz 2 parameters types scala

我显然遗漏了以下为什么不编译的原因:

trait SomeTrait{
def homepageClass[A <: SomeType]: Class[A]
}

class SomeOtherType extends SomeType

object SomeObject extends SomeTrait{
def homepageClass = classOf[SomeOtherType]
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 11

这里的问题是以下两个声明是不同的:

def homepageClass[A <: SomeType]: Class[A]  // has type parameters
def homepageClass = classOf[SomeOtherType]  // doesn't have type parameters
Run Code Online (Sandbox Code Playgroud)

要完成您想要的任务,您需要声明一个抽象类型,如下所示:

trait SomeTrait{
  type A <: SomeType
  def homepageClass: Class[A]
}

object SomeObject extends SomeTrait {
  type A = SomeOtherType
  def homepageClass: Class[A] = classOf[SomeOtherType]
}
Run Code Online (Sandbox Code Playgroud)

要么

trait SomeTrait[A <: SomeType] {
  def homepageClass: Class[A]
}


object SomeObject extends SomeTrait[SomeOtherType] {
  def homepageClass: Class[SomeOtherType] = classOf[SomeOtherType]
}
Run Code Online (Sandbox Code Playgroud)