假设我具有以下界面:
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
答案 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