Generics 使用Kotlin泛型where子句作为属性的返回类型

Generics 使用Kotlin泛型where子句作为属性的返回类型,generics,kotlin,properties,Generics,Kotlin,Properties,是否可以使用Kotlin泛型where子句作为属性的返回类型 如果是,怎么做 我已经将它用于函数的返回类型,但似乎无法使它用于属性,这导致我假设它不会用于属性 我之所以需要它,是因为我的对象属性必须实现多个层次结构。我使用类extends/implements子句中的委托组合来实现它们 问题是,我希望将实现类的有限API公开给某些代码(而不是完整的API),这是我希望通过有限的接口实现的。唯一的问题是,虽然我可以对实际的对象使用委托组合:s,但我似乎不能将其仅用于接口。您可以将where子句放在

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

如果是,怎么做

我已经将它用于函数的返回类型,但似乎无法使它用于属性,这导致我假设它不会用于属性

我之所以需要它,是因为我的对象属性必须实现多个层次结构。我使用类extends/implements子句中的委托组合来实现它们


问题是,我希望将实现类的有限API公开给某些代码(而不是完整的API),这是我希望通过有限的接口实现的。唯一的问题是,虽然我可以对实际的
对象使用委托组合:
s,但我似乎不能将其仅用于接口。

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

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

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

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

示例:

  • T
    是从Iterable类型推断出来的:
  • val Iterable.firstNotEmpty:T其中T:CharSequence?
    get()=第一个{!it.isNullOrEmpty()}
    
  • 编译错误-属性的类型参数必须在其接收器类型中使用:
  • inline val Iterable.firstIntsanceOf:T其中T:Any
    get()=第一个{它是T}作为T
    
    您能详细解释一下吗?我不认为属性需要定义类型有什么意义,因为你从来没有向getter传递过什么,如果你有一个泛型参数,你就把类型定义放在类行中。@Bananon的可能重复:这不适用于我的用例,因为我不需要
    where
    来进行泛型,我想要它,这样我就可以创建一个没有从多个其他类型继承的显式接口的类型。@XDR很抱歉误解了您。我发布了一个答案,解释了何时可以使用泛型类型作为属性的返回类型。我需要使用where子句作为属性的返回类型。我会更新我的问题…
    val <T> Iterable<T>.firstNotEmpty: T where T : CharSequence?
        get() = first { !it.isNullOrEmpty() }
    
    inline val <reified T> Iterable<*>.firstIntsanceOf: T where T : Any
        get() = first { it is T } as T