在Kotlin中,如何定义具有上限的泛型类型的属性?

时间:2019-02-18 15:42:13

标签: generics kotlin

以下Java代码的Kotlin等效项是什么?

class Test {
    Class<? extends Number> types = new Class[] {
            Integer.class, Long.class, Short.class, Byte.class, Float.class, Double.class
    };
}

3 个答案:

答案 0 :(得分:1)

您可以使用out关键字:

var types: Array<Class<out Number>> = arrayOf(
    Integer::class.java, 
    Long::class.java, 
    Short::class.java, 
    Byte::class.java, 
    Float::class.java, 
    Double::class.java
)

out修饰符用于指示协方差(类似于Java中的? extends T)。 协方差-是将通用类型参数从类更改为其父级之一的功能,即将List<String>分配给List<Any>

答案 1 :(得分:1)

这里您需要的是协变量数组,或通用参数上的out方差:

var types: Array<Class<out Number>> = arrayOf(
        Int::class.java,
        Long::class.java,
        Short::class.java,
        Byte::class.java,
        Float::class.java,
        Double::class.java
)

documentation of this method下的文档中介绍了这种情况(尽管如果您不熟悉它,可能要花一些时间才能弄清所有内容)。

答案 2 :(得分:0)

除了其他答案外,您还可以使用Kotlin数据类型在Kotlin中生成相同的代码;

var types: Array<KClass<out Number>> = arrayOf(
        Int::class,
        Long::class,
        Short::class,
        Byte::class,
        Float::class,
        Double::class
    )

在这里,我们使用KClass这是Kotlin类的引用类型,而out是协方差类型注释(生产者)。