[英]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
}
// 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.