提问人:derbossdeveloperbrauchthilfe 提问时间:11/16/2023 最后编辑:derbossdeveloperbrauchthilfe 更新时间:11/16/2023 访问量:65
控制扩展范围之外的类的使用?
Control use of class outside of extension scope?
问:
一个非常具体的问题:如何控制用作链式扩展函数(在本例中为中缀,但无关紧要)的数据类的可见性 - 通过警告或隐藏。
简单示例:使用链式中缀函数的通用 if else 语句:
infix fun<T> Boolean.gives(item: T?) : GivesOtherResult<T?> = if (this) { GivesOtherResult(item) } else GivesOtherResult(null)
infix fun<T> GivesOtherResult<T?>.other(item: T?) : T? = this.eject ?: item
对于持有者类:
data class GivesOtherResult<T>(val eject: T?)```
用法:
true gives 1 other 2
期望行为:只能与函数一起使用。在该函数之外,它应该被隐藏或需要 OptIn/显示警告GivesOtherResult
GivesOtherResult<T?>.other
限制:没有单独的模块,也没有 ,因为应该只与函数一起调用,由 使用 控制。当然还有 Kotlin 的用法T.other
other
gives
GivesOtherResult
我尝试创建一个注释来请求 OptIn
@RequiresOptIn(level = RequiresOptIn.Level.WARNING, message = "Underlying class for extension Functions. Should not be used explicitly. Opt in if used in extension function")
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.CLASS)
annotation class InternalUseOnly
并用于GivesOtherResult
@InternalUseOnly
data class GivesOtherResult<T>(val eject: T?)
@OptIn(InternalUseOnly::class)
infix fun<T> Boolean.gives(item: T?) : GivesOtherResult<T?> = if (this) { GivesOtherResult(item) } else GivesOtherResult(null)
@OptIn(InternalUseOnly::class)
infix fun<T> GivesOtherResult<T?>.other(item: T?) : T? = this.eject ?: item
但这在使用 otherwhere (like ) 时也会要求 OptIn,这错过了整个事情的重点。GivesOtherResult<T?>.other
true gives 1 other 2 //Asks for OptIn as well
我想不出解决方案,甚至可能吗,有人有想法吗?
顺便说一句:现实生活中的使用可能可以忽略不计,但我正在试验,现在我真的很想让它发挥作用
答: 暂无答案
评论