gpt4 book ai didi

scala - 特征抽象方法

转载 作者:行者123 更新时间:2023-12-05 00:19:29 25 4
gpt4 key购买 nike

如何使用需要存在的抽象方法定义特征,即使它可以有不同的参数。我只想确保扩展 trait 的类具有方法和相同的返回类型。下面的示例(主要是说明性的)重载了“add”并给出了需要定义“add”的错误。我应该如何更改 Trait 中的方法声明?

不幸的是,所有答案都不起作用。我不确定我是否清楚,但我不想在要定义/检查的参数中包含任何已定义的类型(任何、泛型、类型定义),因为它的类型和参数数量可以改变,在我的如果返回可能相同。我只是想让它检查是否存在具有相同名称和返回值的方法而忽略参数。 “Any”不是替代方案,因为它不是类型安全的,我想明确定义函数期望作为参数的内容。

例子:

trait X{
def add: Boolean
}

class Y extends X {
def add(i: Int, s: String) : Boolean = {...}
}

class W extends X {
def add(i: Int, y: Int, w: Set[String]) : Boolean = {...}
}

最佳答案

问题的解释
在 Scala 中的方法/函数def method(x: Int) : Booleandef method() : Booleandef method() : String是不同的。
碰巧它们具有相同的名称,但对于这种语义连接,Scala 编译器并不关心。
所以你只会描述 return type但不是 arguments对于该函数,您不会向编译器提供足够的信息来定义特征。一种选择是提供最通用的类​​型 Any和任意数量的参数。
仅基于函数名称的匹配通常是不可能的。可以用reflection为此,但这很可能最终会导致大量昂贵开销的黑客攻击。
以下是一些使用标准语言功能的可能解决方案:
任意数量的参数任意类型的输入

// any count and any type of input allowed, not much type safety
trait XAny{
def add(args : Any*): Boolean
}
由类型参数给出的任意数量的参数输入类型
// any count and any type of input allowed, all input has to be a kind of A
trait XWithType[A]{
def add(args : A*): Boolean
}
使用没有给定限制的方法的替代解决方案
// any count and any type of input allowed, all input has to be a kind of A
trait XWithArbitraryMethod{
def add(): Boolean // here add now would call the real implementation
}

关于scala - 特征抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35801564/

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