什么是Scala声明“Class <! - ?extends SomeType - >”

时间:2010-06-21 15:44:08

标签: scala parameters types

我显然错过了以下为什么不能编译的内容:

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

class SomeOtherType extends SomeType

object SomeObject extends SomeTrait{
def homepageClass = classOf[SomeOtherType]
}

2 个答案:

答案 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] 
}

更新:我可以考虑的解决方案之间有两个不同之处:

  1. 存在类型产生与Java通配符相同的字节码(和their major intended use is interoperation with wildcards)。

  2. 您可以为抽象类型成员解决方案编写细化类型:

     val x: SomeTrait {type A = SomeOtherType} = SomeObject
    

    我认为你不能用于存在类型。

  3. 还有其他人吗?