次のようなコードがあります。
class testClass {
class A(val next:Option[A]){
def printA=println("A called")
}
class B(val someValue:Int){
def printB=println("B called with value "+someValue)
}
def printStuff[T](obj:T):Any={
obj match{
case a:A=>{ a.printA
return new A(Some(a))
}
case b:B=>{ b.printB
return if (b.someValue==0) new B(0) else
printStuff(new B(b.someValue-1))
}
}
}
ここでは、メソッドprintStuffで、入力と同じタイプのオブジェクトを返したいと思います。ただし、これをコンパイルしようとすると、次のエラーが発生します。
error: type mismatch;
found : a.type (with underlying type testClass.this.A)
required: T
return a
の同様のエラーでreturn b
。戻り値の型をAnyに設定できることはわかっていますが、「実際の」コードでは、関数を再帰下降方式で適用しているため、かなりの数asInstanceOf
のsを追加する必要があります。避ける。
関数を完全に書き直すことなく、Scalaの型システムに私が書き込もうとしているものを理解させることは可能ですか?
編集:実際のコードで重要になる可能性のあるものを引き出すために、例を編集しようとしました:
再帰的であるという事実
その戻り型が引数の1つに依存するという事実。