如何在scala中进行结构类型输入,它只接受子类?

时间:2011-11-16 00:08:34

标签: scala types class-hierarchy structural-typing

不要用文字描述问题,而是让我向您展示一个Scala Interpreter会话,展示我想要做的事情。

    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 classtrait

1 个答案:

答案 0 :(得分: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