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