【问题标题】:Using Kotlin generics where clause for return type of property使用 Kotlin 泛型 where 子句作为属性的返回类型
【发布时间】:2020-02-12 07:12:56
【问题描述】:

是否可以使用 Kotlin 泛型 where 子句作为属性的返回类型?

如果有,怎么做?

我已将它用于返回类型的函数,但似乎无法让它用于属性,这让我认为它不适用于属性。

我需要这个,因为我有多个层次结构,我的对象的属性必须实现。我在类扩展/实现子句中使用<interface> by <class> 委托组合来实现它们。

问题是我想将实现类的有限 API 暴露给某些代码(而不是完整的 API),我想通过有限的接口来做到这一点。唯一的问题是,虽然我可以对实际的object:s 使用委托组合,但我似乎不能只将它用于接口。

【问题讨论】:

  • 你能详细解释一下吗?我不明白一个属性需要定义一个类型有什么意义,因为你从来没有将东西传递给一个 getter,如果你有一个泛型参数,你把类型定义放在类行中。
  • Kotlin Generic Property的可能重复
  • @Bananon:这不适用于我的用例,因为我不需要 where 为了泛型,我想要它以便我可以创建一个没有显式接口的类型继承自多种其他类型。
  • @XDR 抱歉让您误会了。我发布了一个答案,解释了何时可以使用泛型类型作为属性的返回类型。

标签: generics kotlin properties


【解决方案1】:

您可以将where 子句放在属性类型说明之后:

val <T> T.size: Int where T : CharSequence
    get() = this.length

请注意,属性只能声明从其接收者推断出的泛型类型,因为没有语法可以显式调用此类指定类型参数的属性。因此,具有泛型参数的属性只能是扩展属性。

【讨论】:

  • 我需要使用 where 子句作为属性的返回类型。我会更新我的问题...
【解决方案2】:

只有在可以从接收器类型推断出类型参数的情况下,才可以使用 Kotlin 泛型 where 子句作为属性的返回类型。否则,将无法在属性使用时指定泛型类型。

例子:

  1. T 是从 Iterable 类型推断出来的:
val <T> Iterable<T>.firstNotEmpty: T where T : CharSequence?
    get() = first { !it.isNullOrEmpty() }
  1. 编译错误 - 属性的类型参数必须在其接收者类型中使用
inline val <reified T> Iterable<*>.firstIntsanceOf: T where T : Any
    get() = first { it is T } as T

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-18
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多