控制扩展范围之外的类的使用?

Control use of class outside of extension scope?

提问人:derbossdeveloperbrauchthilfe 提问时间:11/16/2023 最后编辑:derbossdeveloperbrauchthilfe 更新时间:11/16/2023 访问量:65

问:

一个非常具体的问题:如何控制用作链式扩展函数(在本例中为中缀,但无关紧要)的数据类的可见性 - 通过警告或隐藏。

简单示例:使用链式中缀函数的通用 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/显示警告GivesOtherResultGivesOtherResult<T?>.other

限制:没有单独的模块,也没有 ,因为应该只与函数一起调用,由 使用 控制。当然还有 Kotlin 的用法T.otherothergivesGivesOtherResult

我尝试创建一个注释来请求 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?>.othertrue gives 1 other 2 //Asks for OptIn as well

我想不出解决方案,甚至可能吗,有人有想法吗?

顺便说一句:现实生活中的使用可能可以忽略不计,但我正在试验,现在我真的很想让它发挥作用

Android Kotlin 注释 扩展方法

评论


答: 暂无答案