kotlin 中的注解数组

Array of anotations in kotlin

kotlin 中以下注释用法的等价物是什么:

@TypeDefs({
        @TypeDef(name = "string-array", typeClass = StringArrayType.class),
        @TypeDef(name = "int-array", typeClass = IntArrayType.class),
        @TypeDef(name = "json", typeClass = JsonStringType.class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
})

这是@TypeDefs的定义

@Target({TYPE, PACKAGE})
@Retention(RUNTIME)
public @interface TypeDefs {
    /**
     * The grouping of type definitions.
     */
    TypeDef[] value();
}
public class Foo {...}

这是@TypeDef

中的一个
@Target({TYPE, PACKAGE})
@Retention(RUNTIME)
@Repeatable(TypeDefs.class)
public @interface TypeDef {
    /**
     * The type name.  This is the name that would be used in other locations.
     */
    String name() default "";

    /**
     * The type implementation class.
     */
    Class<?> typeClass();

    /**
     * Name a java type for which this defined type should be the default mapping.
     */
    Class<?> defaultForType() default void.class;

    /**
     * Any configuration parameters for this type definition.
     */
    Parameter[] parameters() default {};
}

我尝试使用 arrayOf() 但它不起作用。

@TypeDefs(arrayOf(
        @TypeDef(name = "string-array", typeClass = StringArrayType::class),
        @TypeDef(name = "int-array", typeClass = IntArrayType::class),
        @TypeDef(name = "json", typeClass = JsonStringType::class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType::class)
))
data class Foo (...)

我在 IntelliJ Idea 上收到以下错误:An annotation cannot be used as the annotations argument

我必须执行以下操作才能使其正常工作:

  • 去掉内部注释中的 @
  • arrayOf 包裹列表
  • 将数组作为命名参数传递。

这是工作代码:

@TypeDefs(value = arrayOf(
        TypeDef(name = "string-array", typeClass = StringArrayType::class),
        TypeDef(name = "int-array", typeClass = IntArrayType::class),
        TypeDef(name = "json", typeClass = JsonStringType::class),
        TypeDef(name = "jsonb", typeClass = JsonBinaryType::class)
))
data class Line(...)

或者也可以使用方括号代替 arrayOf:

@TypeDefs(value = [
    TypeDef(name = "string-array", typeClass = StringArrayType::class),
    TypeDef(name = "int-array", typeClass = IntArrayType::class),
    TypeDef(name = "json", typeClass = JsonStringType::class),
    TypeDef(name = "jsonb", typeClass = JsonBinaryType::class)
])
data class Line(...)

更新:基于@Zoe 的回答

如果唯一的参数是注释列表,则不需要指定命名参数,它会简化为:

@TypeDefs(
    TypeDef(name = "string-array", typeClass = StringArrayType::class),
    TypeDef(name = "int-array", typeClass = IntArrayType::class),
    TypeDef(name = "json", typeClass = JsonStringType::class),
    TypeDef(name = "jsonb", typeClass = JsonBinaryType::class)
)
data class Line(...)

如果您在 IntelliJ 中使用 Convert file to Kotlin 工具,注释将转换为:

@TypeDefs(
    TypeDef(name = "string-array", typeClass = StringArrayType::class), 
    TypeDef(name = "int-array", typeClass = IntArrayType::class), 
    TypeDef(name = "json", typeClass = JsonStringType::class), 
    TypeDef(name = "jsonb", typeClass = JsonBinaryType::class)
)
data class Foo(...)

似乎与使用 value = arrayOf(...) 一样,如 JaviOverflow 所述。


如果您想使用 arrayOf[],您将需要使用类似这样的东西,但它是多余的星号 * 只是扩展运算符:

@TypeDefs(
    *arrayOf(
        TypeDef(name = "string-array", typeClass = StringArrayType::class),
        ...
    )
)

@TypeDefs(
    *[
        TypeDef(name = "string-array", typeClass = StringArrayType::class),
        ...
    ]
)

否则你会得到类型不匹配。