假设我有一个具有未实现方法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
的结果上显式转换/模式匹配?例如,我可以更新func
中func
的类型签名,以便进行某种类型的推断吗?任何帮助将不胜感激。
答案 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 ++ "!"
}