当前位置: 首页 > 知识库问答 >
问题:

如何在kotlin中使用Android支持typedef注释?

周宸
2023-03-14

我开发android应用程序,经常使用注释作为编译时参数检查,大多是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 只会生成无效代码。如何在 kotlin 中使用@IntDef注释?

共有3个答案

翟凯
2023-03-14

更新:

忘了@IntDef和@StringDef吧,现在有了ART,可以用enums代替。

来自官方GoogleIO:

另外,如果您仍然不确定是否应该使用枚举,您可以在这里的第一个答案的评论中听到一群人互相大喊大叫:https://stackoverflow.com/a/37839539/4036390

老答案:

只需将@IntDef类创建为java类,并通过kotlin代码访问它。

示例:

>

  • 创建您的类型类:

    公共类mType{@IntDef({typeImpl.type1,typeimp1.type2,typeImpl.type3})@Retention(RetentionPolicy.SOURCE)公共@interface typempl{int type1=0;int type2=1;int type3=2;}

    将此函数放在任何Kotlin对象中:

    object MyObject{ fun accessType(@mType.typeImpl mType: Int) { ... } }

    然后访问它:

    fun somOtherFunc(){ MyObject.accessType(type1) }

    **注意:您不必将访问方法放入对象中。

  • 徐丰茂
    2023-03-14

    目前在Kotlin中没有办法实现这一点,因为注释类不能有主体,因此不能在其中声明由< code>IntDef处理的常量。我在《追踪者:https://youtrack.jetbrains.com/issue/KT-11392》中创造了一期

    对于您的问题,我建议您使用简单的枚举。

    戴瑞
    2023-03-14

    编辑:如果您错过了问题或答案的注释,值得注意的是,以下技术可以编译,但不会创建在Java中获得的编译时验证(这部分违背了这样做的目的)。请考虑改用enum类。

    通过将注释类之外的值定义为const vals,实际上可以使用@IntDef支持注释。

    使用您的示例:

    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
        }
    }
    

    请注意,此时编译器似乎需要@IntDef注释的Long,而不是实际的Ints。

     类似资料:
    • 我希望将内置的JUnit5与Gradle Kotlin DSL一起使用,因为在构建过程中,我会收到以下警告: 另外,这个问题是相关的,但要求创建新的任务,而不是定制现有的任务:我如何在gradle kotlin-dsl中覆盖一个任务 这里有一个正常分级的解决方案。

    • 我看到一个例子解释了Kotlin JVM的KATP,它正在工作。 我想知道它是否支持Kotlin JS?有什么例子吗?

    • 静态编程语言是否支持像这样的java注释,因为我无法让它工作。我可以用注释颜色,但实际上没有得到该注释的lint检查。 例子 传递,不显示线头。应使用R颜色显示皮棉。colorPrimary,不与

    • 在Android M上,谷歌已经完全去掉了Apache HTTP客户端的支持。 这也可能是Android M上这么多应用崩溃的原因。 我真的需要更新一个应用程序非常快,但我现在不能将它移植到

    • Kotlin是一种针对JVM(和其他平台)的静态类型语言,它允许编写简洁而优雅的代码,同时提供与Java编写的现有库的互操作性。 Spring Boot通过利用其他Spring项目(如Spring Framework,Spring Data和Reactor)的支持来提供Kotlin支持。 有关更多信息,请参阅Spring Framework Kotlin支持文档。 从Spring Boot和Kot

    • 我怎么才能让它起作用呢?类似的攻略我看了很多,唉。使用高于23.1.1的支持库多次失败。 第三步:当然,我试了第一个gradlew:App:Dependenics等,但那个一直崩溃。是的,我使用JDK1.8。它是一个注册的bug,从夏天开始一直没有解决。 对了...Android、支持包、浓缩咖啡都是谷歌的?