我想知道是否有任何方法可以将注释用作泛型的类型参数并确定提供的输入的实例?本质上,我只想允许使用特定注释的对象被方法接受,并使用类型转换来确定基础类型。
我尝试用注释标记通用类型,但是当我尝试转换模型时,出现错误:“不兼容的类型:UsesAnnotation和MyAnnotation”
这是有道理的,因为我没有扩展MyAnnotation,所以只是在上面标记UsesAnnotation。但是有办法使这项工作吗?我只想将输入限制为使用注释的实例,然后找出作为输入提供的类型。
注释:
@MustBeDocumented
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation
抽象工厂:
abstract class MyFactory<in t: Any> {
...
abstract fun genericMethod(model: T): Int
...
}
其子类:
class MyFactoryImplementation<MyAnnotationType> {
...
override fun genericMethod(model: MyAnnotation): Int {
return when (model) {
is UsesAnnotation -> 1
else -> 0
}
...
}
带注释的类:
@MyAnnotation
class UsesAnnotation
最佳答案
RUNTIME
保留的批注进行批注。为此,您需要将kotlin-reflect
添加到您的类路径中。inline fun <reified T : Any> isAnnotatedWith(t: T, annotationClass: KClass<*>) =
isAnnotated(t::class, annotationClass)
fun isAnnotated(inputClass: KClass<*>, annotationClass: KClass<*>) =
inputClass.annotations.any { it.annotationClass == annotationClass }
您可以从上面的代码将注释实例传递到函数
isAnnotatedWith
中,并获得结果。