![](/img/trans.png)
[英]Is it possible in Scala to force the caller to specify a type parameter for a polymorphic method?
[英]In Scala is there a way to specify that the return type should match the type of the method caller?
例如,我有一個名為Foo的類
abstract class Foo {
def f(): ??? = { ... }
}
class Bar extends Foo {
...
}
class Baz extends Foo {
...
}
我想要的是f由Bar調用時返回Bar的方法,而由Baz調用時返回Baz的方法。 Bar和Baz都具有相同的構造函數,因此f中的代碼兩次都相同,除了我必須說new Bar(...)還是new Baz(...)。 有什么辦法說新的TypeOfWhateverClassIsCallingMe(...)?
聽起來像您想要F界限類型。 但是,您仍然必須為所有子類實現它,因為父類不了解子構造函數(“哺乳動物”不知道如何制作“貓”)。
abstract class Foo[T <: Foo[T]] {
def createMe(): T
}
class Bar extends Foo[Bar] {
override def createMe() = new Bar
}
class Baz extends Foo[Baz] {
override def createMe() = new Baz
}
這基本上為您提供了編譯時的安全性, Foo
所有子級都需要實現一個創建自己類的方法。
這里深入討論。
假設您要調用該方法的具體子類的類型(我不會將其稱為“方法調用者的類型”,而是“被調用者的類型”),則可以執行
def f(): this.type = ???
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.