【问题标题】:Converting a generic enum from Java to Kotlin将通用枚举从 Java 转换为 Kotlin
【发布时间】:2018-04-02 13:42:02
【问题描述】:

我目前正在尝试将一个小型应用程序从 java 转换为 kotlin,而无需重写所有内容,但是我遇到了泛型枚举的问题,因为 kotlin 不支持枚举中的泛型。

我在 java 中有以下枚举:

public enum Property {
    LAST_VIEW(0, 1, Integer.class),
    MAXIMIZED(2, false, Boolean.class),

    private final int       id;
    private final String    defaultValue;
    private final Class<?>  datatype;

    <T> Property(final int id, final T defaultValue, final Class<T> datatype) {
        this.id = id;
        this.defaultValue = defaultValue == null ? null : defaultValue.toString();
        this.datatype = datatype;
    }
}

我将它用于通用属性 api,以验证我的默认值是否具有正确的类型,并进行一些运行时检查,以便在我犯错时立即提供适当的反馈。

有没有办法在 kotlin 中创建这样一个类,或者我应该考虑重构我的属性 api 吗?

【问题讨论】:

  • 请举例说明如何使用枚举

标签: java generics enums kotlin


【解决方案1】:

也许您可以为此考虑密封类,而不是枚举?

sealed class Property<T>(val id: Int, val defaultValue: T, dataType: Class<T>) 
object LastView : Property<Int>(0, 1, Int::class.java)
object Maximised : Property<Boolean>(2, false, Boolean::class.java)

在这种情况下,因为LastViewMaximized 没有任何用户定义或可变状态,我将它们定义为objects。而且因为Property&lt;T&gt; 是密封的,所以不能创建其他实例。

【讨论】:

  • 我认为这适合我当前的用例,因为我从不迭代枚举值左右。我会在一段时间内尝试并报告:) 谢谢
【解决方案2】:

虽然 Kotlin 不允许构造函数有自己的类型参数,但 Java 中的此功能仅影响调用站点的构造函数参数的类型检查(枚举条目不保留类型安全)。因此,通过声明一个辅助泛型类并在辅助构造函数中接受它的实例,可以在 Kotlin 中实现类似的行为:

class TypedDefaultValue<T>(
    val defaultValue: T,
    val datatype: Class<T>
)

enum class Property(
    val id: Int, 
    val defaultValue: Any, 
    val datatype: Class<out Any>
) {
    LAST_VIEW(0, TypedDefaultValue(1, Int::class.java)), // calls the constructor below
    MAXIMIZED(2, TypedDefaultValue(false, Boolean::class.java));

    constructor(id: Int, typedDefaultValue: TypedDefaultValue<out Any>) :
        this(id, typedDefaultValue.defaultValue, typedDefaultValue.datatype)
}

在枚举代码中使用Any?out Any? 也可以接受可为空的值。

【讨论】:

  • 我更喜欢 Todds 解决方案,因为它让我有更好的类型安全性。
猜你喜欢
  • 1970-01-01
  • 2013-01-17
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2020-08-21
  • 2021-01-04
  • 2013-06-02
  • 2016-01-19
相关资源
最近更新 更多