generics - 如何在 Kotlin 中将多个 Upper Bounds 语法与委托(delegate)语法结合起来

标签 generics kotlin delegation

假设我有以下接口(interface):

interface A
interface B
interface C

我想为类型 A 和 B 创建具有多个上限的类:

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

我还想对 C 类型使用委托(delegate):

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

最佳答案

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

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

关于generics - 如何在 Kotlin 中将多个 Upper Bounds 语法与委托(delegate)语法结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51065694/

相关文章:

java - 通用 N 元树(每个子节点有两个以上节点的树)Java 中使用列表遍历节点的树

java - 无法从 java.lang.Class<T> 转换为 java.lang.Class<T>

android - (kotlin) editText.toString().toInt() 在 android studio 中不起作用

java - 为什么 Kotlin 的内部可访问性与 Java 的包私有(private)可访问性不同?

c# - 在c#中,类型是否可以将其成员类型的接口(interface)公开为自己的接口(interface)

c# - 使用简单注入(inject)器在 C# 中实现域事件处理程序模式

java - 从左边框滑动以打开 Activity

iOS 委托(delegate)和单例模式

c++ - 使用 Qt 在 C++ 中委派类构造函数

java - 为什么在填充包含 < 类型元素的集合时行为会有所不同?扩展 T>?