如何在Kotlin中将多个Upper Bounds语法与委托语法结合在一起

时间:2018-06-27 14:44:00

标签: generics kotlin delegation

假设我具有以下界面:

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 :(得分:3)

通过查看grammar for classes可以很快找出这两件事的顺序,您会看到委托说明符位于类型约束之前:

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

然后,只需要弄清楚如何使它们按此顺序工作-事实证明,如果将类型约束放在新行上,则可以正确解析内容(如此处的documentation和那里):

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