如何正确使用传递给 Kotlin 中通用接口的类

问题描述 投票:0回答:1

我有一个接口 BetterEnum。我需要所有实现此接口的枚举类具有多个静态方法。将这些方法放在接口中是合乎逻辑的,但我不知道如何

我尝试将方法放在伴随对象中并添加@JvmStatic注释,但是IDEA要求我指定这些方法的实现。我对此很好,但是为了使方法起作用,我需要从传递的类 T 中获取常量列表。我尝试直接从 T 调用方法,尝试从中调用方法(但这被定义为实例,显然不是一个类),尝试从(T as Enum)调用。我将非常感谢您的帮助!

interface BetterEnum<T: Enum<T>> {
    companion object {
        //getting the first element of an enumeration list (for example)
        @JvmStatic
        fun <T : Enum<T>> test(): Enum<T> {
            //return T.values()[0] - does not work
            //return this.values()[0] - does not work
            //return (T as Enum<T>).values()[0] - does not work
        }
    }
}
kotlin generics
1个回答
0
投票

Kotlin 通过设计限制此类构造(隐式继承静态方法)。

您可以通过从共享实现显式扩展伴随对象来重现它。

就我个人而言,我不会这样做并寻找另一种设计解决方案,因为对“未指定”枚举类和类型参数进行操作会使初始化此类对象有点复杂并且运行时不安全,但出于您的好奇心:

abstract class BetterEnum<T : Enum<T>>(val clazz : Class<T>) {
    fun test(): Enum<T> {
        return clazz.enumConstants[0]
    }
}

enum class FooEnum {
    enumValue;

    companion object : BetterEnum<FooEnum>(FooEnum::class.java)
}

fun run() {
    FooEnum.test()  // works and returns enumValue
}
© www.soinside.com 2019 - 2024. All rights reserved.