2016-08-29 3 views
2

例えば、私は私が好きな何のFooScalaでは、戻り値の型がメソッド呼び出し元の型と一致するように指定する方法がありますか?

abstract class Foo { 
    def f(): ??? = { ... } 
} 
class Bar extends Foo { 
    ... 
} 
class Baz extends Foo { 
    ... 
} 

と呼ばれるクラスを持っているが、それはバズで呼ばれていたときに、それはバー、およびバズで呼ばれていますバーを戻すために、Fのための方法です。 BarとBazの両方が同じコンストラクタを持っているので、新しいBar(...)か新しいBaz(...)を指定する必要があるかどうかを除いて、fのコードは同じ時間になります。新しいTypeOfWhateverClassIsCallingMe(...)を言う方法はありますか?

+0

関連:http://stackoverflow.com/questions/13048725/type-of-this-in-scala?rq=1 – Thilo

+0

本当に '新しいSameAsThis()'または 'this'だけを返したいですか?前者の場合、抽象ファクトリメソッドが必要であり、すべてのサブクラスに対して実装する必要があると思います。 – Thilo

答えて

2

F-Boundedタイプが好きです。しかし、親クラスは子コンストラクタ( "哺乳類"は "Cat"の作り方を知らない)についての知識がないため、すべてのサブクラスに対してもそれを実装する必要があります。

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のすべての子どもたちが独自のクラスのようなものを作成するメソッドを実装する必要があり、あなたのコンパイル時の安全性を提供します。

詳細な説明here

1

あなたはメソッドがで呼び出される具象サブクラスの種類をしたいと仮定すると、(私は「メソッドの呼び出し元の種類」これを呼び出すことはありません、「invokeeのタイプ」むしろ)、あなたが行うことができます

def f(): this.type = ??? 
+2

いいえ、それは正しくありません。 'this.type'は' this'を返すことしかできません。具体的なサブクラスのインスタンスではありません。 –

関連する問題