1. @fancy fun baz(@fancy foo: Int): Int {
    2. return (@fancy 1)
    3. }
    4. }

    在多数情形中 @ 标识是可选的。只有在注解表达式或本地声明中才必须:

    1. fancy class Foo {
    2. fancy fun baz(fancy foo: Int): Int {
    3. @fancy fun bar() { ... }
    4. return (@fancy 1)
    5. }
    6. }

    如果要给构造函数注解,就需要在构造函数声明时添加 constructor 关键字,并且需要在前面添加注解:

    1. class Foo @inject constructor (dependency: MyDependency)
    2. //...

    也可以注解属性访问者:

    1. special("example") class Foo {}

    注解也可以用在 Lambda 中。这将会应用到 lambda 生成的 invoke() 方法。这对 框架很有用,在这个框架中注解被用来并发控制

    1. annotation class Suspendable
    2. val f = @Suspendable { Fiber.sleep(10) }

    java 注解在 kotlin 中是完全兼容的:

    1. import org.junit.Assert.*
    2. class Tests {
    3. Test fun simple() {
    4. assertEquals(42, getTheAnswer())
    5. }
    6. }

    java 注解也可以通过在导入是重命名实现像修改者那样:

    1. //Java
    2. public @interface Ann {
    3. int intValue();
    4. String stringValue(0;
    5. }
    6. //kotlin

    像 java 中那样,值参数是特殊的情形;它的值可以不用明确的名字。

    1. public @interface AnnWithValue {
    2. }
    3. //kotlin
    4. AnnWithValue("abc") class C

    如果java 中的 value 参数有数组类型,则在 kotlin 中变成 vararg 参数:

    1. // Java
    2. public @interface AnnWithArrayValue {
    3. String[] value();
    4. }
    5. // Kotlin
    6. AnnWithArrayValue("abc", "foo", "bar") class C

    如果你需要明确一个类作为一个注解参数,使用 Kotlin 类KClass。Kotlin 编译器会自动把它转为 java 类,因此 java 代码就可以正常看到注解和参数了。

    1. // Java
    2. public @interface Ann {
    3. int value();
    4. }
    5. // Kotlin
    6. fun foo(ann: Ann) {
    7. }