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

时间:2014-06-18 20:06:45

标签: scala types casting type-inference traits

假设我有一个具有未实现方法SomeTrait的特征func。此方法将返回扩展SomeTrait的内容。换句话说,我有以下内容:

trait SomeTrait
{
  def func(x: Int): SomeTrait
}

现在,我实现了扩展ExtensionClass的类SomeTrait,事实证明我实际上希望在此类中实现func以返回类型为{{1}的对象}}:

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 ++ "!" } 返回的对象上调用anotherMethod,就会出现问题:

func

类型系统仅识别val extension = new ExtensionClass("hello") extension.func(5).anotherMethod 提供的对象属于extension.func(5)类型,因此SomeTrait不可见。这让我们想到了一个问题:

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

1 个答案:

答案 0 :(得分: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 ++ "!"
}

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

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 ++ "!"
}