Как сделать структурную типизацию в Scala, которая также принимает только подклассы? - PullRequest
2 голосов
/ 16 ноября 2011

Вместо того, чтобы описать проблему словами, позвольте мне показать вам сеанс интерпретатора 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.

ПРИМЕЧАНИЕ: Я пытаюсь сделать это таким образом, потому что моя иерархия классов уже способсложно.Учитывая это, я предпочитаю не добавлять <strong>ParentWithName</strong> abstract class или trait, если этого можно избежать.

1 Ответ

6 голосов
/ 16 ноября 2011

Верьте или нет, проблема заключается в скобках в сигнатуре метода.Это работает:

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
...