Как использовать андроиды поддержки Android в kotlin?

Я разрабатываю приложения для Android и часто использую аннотации в качестве проверки параметров времени компиляции, в основном андроиды поддержки андроида.

Пример в java-коде:

public class Test { @IntDef({Speed.SLOW,Speed.NORMAL,Speed.FAST}) public @interface Speed { public static final int SLOW = 0; public static final int NORMAL = 1; public static final int FAST = 2; } @Speed private int speed; public void setSpeed(@Speed int speed) { this.speed = speed; } } 

Я не хочу использовать перечисления из-за проблем с производительностью в Android. Автоматический конвертер в kotlin просто генерирует неверный код. Как использовать аннотацию @IntDef в kotlin?

Фактически можно использовать @IntDef поддержки @IntDef , определяя ваши значения вне класса аннотации как const val s.

Используя ваш пример:

 import android.support.annotation.IntDef public class Test { companion object { @IntDef(SLOW, NORMAL, FAST) @Retention(AnnotationRetention.SOURCE) annotation class Speed const val SLOW = 0L const val NORMAL = 1L const val FAST = 2L } @Speed private lateinit var speed: Long public fun setSpeed(@Speed speed: Long) { this.speed = speed } } 

Обратите внимание, что на данный момент компилятор, по-видимому, требует типа Long для аннотации @IntDef вместо фактического Int s.

В настоящее время нет никакого способа добиться этого в Котлине, поскольку класс аннотации не может иметь тело, и поэтому вы не можете объявить в нем константу, которая будет обрабатываться IntDef . Я создал проблему в трекере: https://youtrack.jetbrains.com/issue/KT-11392

Для вашей проблемы, однако, я рекомендую вам использовать простой перечисление.

Использовать это:

 companion object { const val FLAG_PAGE_PROCESS = 0L//待处理const val FLAG_PAGE_EXCEPTION = 1L//设备异常const val FLAG_PAGE_UNCHECKED = 2L//未审核const val FLAG_PAGE_AUDIT = 3L//统计val FLAG_PAGE = "FLAG_PAGE" fun newInstance(@FlagPageDef flagPage: Int): RepairFormsListFragment { val fragment = RepairFormsListFragment() val args = Bundle() fragment.arguments = args return fragment } @Retention(AnnotationRetention.SOURCE) @IntDef(FLAG_PAGE_PROCESS, FLAG_PAGE_EXCEPTION, FLAG_PAGE_UNCHECKED, FLAG_PAGE_AUDIT) annotation class FlagPageDef }