Trait抽象方法

4
如何定义一个具有抽象方法的特质,即使它可以具有不同的参数也需要存在。我只想确保扩展该特质的类具有相同返回类型的方法。下面的示例(主要用于说明)重载了“add”,并显示“add”需要被定义的错误。我应该如何更改特质中的方法声明?
不幸的是,所有答案都无法解决问题。我不确定自己是否清楚,但我不希望在要定义/检查的参数中有任何定义的类型(Any、泛型、类型定义),因为它的类型和参数数量可能会发生变化,在我的情况下返回值可能相同。我只想检查是否存在相同名称和返回值的方法,而忽略参数。使用“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 = {...}
}

1
X的用户如何调用这些方法? - Lee
X 作为一个抽象类,它只会被定义和扩展。 - Trp
2个回答

5

问题的解释

在Scala中,下面这些方法/函数是不同的:

def method(x: Int) : Boolean def method() : Boolean def method() : String

虽然它们恰好有相同的名字,但Scala编译器并不关心这种语义上的联系。 因此,如果您只描述了函数的返回类型而没有指定参数,则为定义特征提供的信息不足。一种选择是给出最通用的类型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
}

我修改了描述,也许会更清楚我想要实现什么。不幸的是,这个解决方案并不符合我的需求。 - Trp
根据您的要求,我添加了一些更详细的解释。很抱歉地说,这样做将严重偏离预期的使用方法。 - Andreas Neumann
1
我认为我期望的目标是不可能实现的。不过还是谢谢你的回答。 - Trp

1
这个怎么样?
trait X{
   def add(as: Int*): Boolean
} 

使用可变参数可以适用于所有命名的情况。但是,如果您想传递不同类型的参数,则无法使用此方法,但是可以使用任意数量的Int参数。请参见this question。如果您希望非常动态并且不关心类型安全性,还可以将参数类型更改为Any*,但可能有更好的方法可以实现这一点而不会牺牲类型安全性。

但是可能有更好的方法来实现这一点,而不会牺牲类型安全性。 - Trp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接