Как объединить несколько синтаксиса верхних границ с синтаксисом делегирования в Kotlin - PullRequest
0 голосов
/ 27 июня 2018

Допустим, у меня есть следующие интерфейсы:

interface A
interface B
interface C

Я хочу создать класс с несколькими верхними границами для типов A и B:

class First<T>(val t: T) where T : A, T : B

Я также хочу использовать делегирование для типа C:

class Second(val c: C) : C by c

Мой вопрос: как мне объединить оба в одном объявлении класса?

Я пробовал это:

class Third<T>(val t: T, val c: C) where T : A, T : B, C by c // syntax error: "Expecting : before the upper bound"

А это:

class Third<T>(val t: T, val c: C) : C by c where T : A, T : B // unresolved reference where

1 Ответ

0 голосов
/ 27 июня 2018

Порядок этих двух вещей можно выяснить довольно быстро, посмотрев на грамматику для классов , вы увидите, что спецификаторы делегирования предшествуют ограничениям типа:

class 
  : modifiers ("class" | "interface") SimpleName
      typeParameters?
      primaryConstructor?
      (":" annotations delegationSpecifier{","})?
      typeConstraints
      (classBody? | enumClassBody)
  ;

Тогда нужно просто выяснить, как заставить их работать в таком порядке - получается, что все анализируется правильно, если вы помещаете ограничения типа в новую строку (как видно из документации здесь и там):

class Third<T>(val t: T, val c: C) : C by c
        where T : A, T : B
...