繁体   English   中英

特质抽象方法

[英]Trait abstract method

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

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

例:

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) : Boolean def method() : Boolean def 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
}

由type参数给出的任意数量的参数输入类型

// 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
}

这样的事怎么样?

trait X{
   def add(as: Int*): Boolean
} 

通过使用varargs,这适用于所有已命名的案例。 但是,如果要传递不同类型的参数,这将无效,但可以使用任意数量的Int参数。

看到这个问题

如果你想要超级动态并且不关心类型安全,你也可以将参数类型更改为Any* ,但是可能有更好的方法来做到这一点,不会牺牲类型安全性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM