Scala: может ли абстрактный тип быть подтипом более чем одного другого типа? - PullRequest
6 голосов
/ 04 октября 2011

С учетом следующих определений Scala

abstract class C {
    type T1 <: { def m() : Int }
    type T2 <: { def n() : Int }
}

есть ли способ определить третий тип в C, который ограничен подтипом как T1, так и T2? Э.Г.

    type T3 <: T1 & T2 // does not compile

Мне кажется, что (частично) причина, по которой это не будет работать так, как написано, заключается в том, что я не могу быть уверен, что это не приведет к недопустимому ограничению (например, наследование от двух классов). Таким образом, связанный вопрос будет, если я смогу ограничить T1 и T2, чтобы это было законно, например, требуя, чтобы они оба были чертами.

Ответы [ 2 ]

11 голосов
/ 04 октября 2011

Делает ли это то, что вам нужно?

type T3 <: T1 with T2

Это не требует, чтобы T1 и T2 были обеими чертами - вы могли бы сделать допустимую реализацию, например, используя одну черту и класс (не имеет значения, какая из них какая).

Если бы вы попытались определить конкретный подтип C, где T1 и T2 оба были классами, он не скомпилировался бы, поэтому я не стал бы беспокоиться о принудительном применении этого в ограничении.

7 голосов
/ 04 октября 2011

Конечно, вы можете, но пересечение типа пишется с , а не & .

abstract class C {
  type T1 <: { def m() : Int }
  type T2 <: { def n() : Int }
  type T3 <: T1 with T2
}

class X extends C {
  trait T1 {def m(): Int}
  class T2 {def n(): Int = 3}
  class T3 extends T2 with T1 {def m(): Int = 5}
}

если T1 и T2 оба класса, вы просто не сможете сделать конкретную реализацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...