我想知道是否有任何方法可以将注释用作泛型的类型参数并确定提供的输入的实例?本质上,我只想允许使用特定注释的对象被方法接受,并使用类型转换来确定基础类型。

我尝试用注释标记通用类型,但是当我尝试转换模型时,出现错误:“不兼容的类型: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中,并获得结果。

    10-08 12:58