返回特征中未实现方法的类型

pro*_*nce 2 types casting scala type-inference traits

假设我有一个SomeTrait未实现方法的特征func.这种方法将返回扩展的东西SomeTrait.换句话说,我有类似以下内容:

trait SomeTrait
{
  def func(x: Int): SomeTrait
}
Run Code Online (Sandbox Code Playgroud)

现在,我实现了一个ExtensionClass扩展的类,SomeTrait事实证明我实际上希望func在这个类中实现返回一个类型的对象ExtensionClass:

class ExtensionClass(val param: String) extends SomeTrait
{
  override def func(x: Int): SomeTrait = return new ExtensionClass("test")

  // ExtensionClass also defines another method not specified in SomeTrait
  def anotherMethod: String = return param ++ "!"
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,上述所有内容都很有效.如果我想调用anotherMethod返回的对象,就会出现问题func:

val extension = new ExtensionClass("hello")
extension.func(5).anotherMethod
Run Code Online (Sandbox Code Playgroud)

类型系统只识别给定的对象extension.func(5)是类型SomeTrait,因此anotherMethod不可见.这让我们想到了一个问题:

问题: 是否可以进行上述工作而无需在结果上显式转换/模式匹配func?例如,我可以更新funcin 的类型签名,SomeTrait以便可以进行某种类型的推断吗?任何帮助将不胜感激.

Lee*_*Lee 6

您可以添加通用参数:

trait SomeTrait[T <: SomeTrait[T]] {
    def func(x: Int): T
}

class ExtensionClass(val param: String) extends SomeTrait[ExtensionClass] {
    def func(x: Int) = new ExtensionClass("test")
    def anotherMethod: String = param ++ "!"
}
Run Code Online (Sandbox Code Playgroud)

或者你可以添加一个抽象类型的成员:

trait SomeTrait {
    type T <: SomeTrait
    def func(x: Int): T
}

class ExtensionClass(val s: String) extends SomeTrait {
    type T = ExtensionClass
    def func(x: Int) = new ExtensionClass("test")
    def anotherMethod: String = s ++ "!"
}
Run Code Online (Sandbox Code Playgroud)