/**要求并明确同意使用 API 的某些元素的一种机制。为了避免潜在的问题，编译器会向此类 API 的用户发出警告， 告知他们这些条件，并要求他们在使用 API 之前选择加入。
 *1。@RequiresOptIn：要求明确声明后才能使用
 *2.传播式声明：@MMyOptInAnnotation
 *3.非传播式声明：@OptIn(MyOptInAnnotation::class)
 *4.其它:@file:OptIn(MyAnnotationime::class),-Xopt-in=org.mylibrary.MyOptInAnnotation
 */
//@file:OptIn(MyDateTime::class)    //在一个文件的所有函数和类中使用要求选择加入时使用
import java.util.Date

@RequiresOptIn  //RequiresOptIn.Level.ERROR、RequiresOptIn.Level.WARNING（level=xxx,message="yyy"）
@Retention(AnnotationRetention.BINARY)
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
annotation class MyDateTime

@MyDateTime
class MyDateProvider{}

//传播式
@MyDateTime
fun getDate(): Date {
    val dateProvider: MyDateProvider
    return Date()
}
@MyDateTime
fun displayDate() {
    println(getDate())
}

//非传播式
@OptIn(MyDateTime::class)
fun getDate1(): Date {
    val dateProvider: MyDateProvider
    return Date()
}

fun displayDate1() {
    println(getDate1())
}

//试验API转正
@Deprecated("This opt-in requirement is not used anymore. Remove its usages from your code.")
@RequiresOptIn
annotation class ExperimentalDateTime

fun main(){

}