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