gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:33:31 25 4
gpt4 key购买 nike

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

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

现在,我实现了一个扩展 SomeTrait 的类 ExtensionClass,事实证明我实际上想要在这个类中实现 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 ++ "!"
}

到目前为止,上面的一切都运行良好。如果我想像这样在 func 返回的对象上调用 anotherMethod,就会出现问题:

val extension = new ExtensionClass("hello")
extension.func(5).anotherMethod

类型系统只识别 extension.func(5) 给出的对象是 SomeTrait 类型,所以 anotherMethod 是不可见的.这引出了我的问题:

问题:是否可以在不必对 func 的结果显式转换/模式匹配的情况下完成上述工作?例如,我可以更新 SomeTraitfunc 的类型签名,以便进行某种类型推断吗?任何帮助将不胜感激。

最佳答案

您可以添加一个通用参数:

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

关于scala - 特征中未实现方法的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24294184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com