2

問題を言葉で説明する代わりに、私がやりたいことを示すScalaインタープリターセッションを紹介します。

    scala> class A extends Parent{
         | def name = "Alex"
         | }
    defined class A

    scala> class B extends Parent{
         | def name = "Bernardo"
         | }
    defined class B

    scala> def addFamilyName[T <: Parent](fn:String, c:T{def name():String}) = c.name + " " + fn
    addFamilyName: [T <: Parent](fn: String, c: T{def name(): String})java.lang.String

    scala> addFamilyName( "Martins", new A())
    <console>:11: error: type mismatch;
     found   : A
     required: ?{def name(): String}
           addFamilyName( "Martins", new A())
                             ^

したがって、基本的には、特定の型のサブクラスであり、シグネチャを持つメソッドも含むパラメータで型を定義したいと思います def name():String

注:クラス階層はすでに複雑になっているため、この方法で実行しようとしています。これを考えると、私は追加しないか、それを回避できるParentWithName abstract classかどうかを好みます。trait

4

1 に答える 1

6

信じられないかもしれませんが、問題はメソッドシグネチャの括弧内にあります。これは機能します:

def addFamilyName[T <: Parent](fn:String, c:T{def name:String}) =
    c.name + " " + fn

追加する必要がありますが、実際には型パラメーターは必要ありません。これも同様に良いです:

def addFamilyName(fn:String, c:Parent{def name:String}) =
    c.name + " " + fn
于 2011-11-16T00:15:53.870 に答える