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),
...
]
)
否则你会得到类型不匹配。
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),
...
]
)
否则你会得到类型不匹配。