如何使泛型扩展数据类

时间:2020-10-10 20:28:11

标签: kotlin generics

我知道我可以做这样的事情:

interface ISpecialEnum{/*interace stuff*/}

fun <T> consumeSpecialEnum(enum: T)
        where T:Enum<T>, T:ISpecialEnum{
    //code
}

强制函数仅接受具有特定接口的枚举。

kotlin中是否有任何东西可以检查泛型是否扩展了数据类?喜欢:

interface ISpecialDataClass{/*interface stuff*/}

fun <T> consumeSpecialDataClass(dataClass: T)
        where T:DataClass<T>, T:ISpecialDataClass{
    //code
}

2 个答案:

答案 0 :(得分:0)

您可以像这样检查类型T是否为数据类(并且它实现了您的接口):

fun <T> func(param : T) where T : ISpecialInterface {
    if (param::class.isData) {
        // do stuff
    }
}

如果仅想检查它是否是数据类,则应删除“ where”子句,但是,为确保类型T不能为空,您需要将fun <T>替换为{{1} },因为fun <T : Any>默认为<T>

答案 1 :(得分:0)

与枚举相反,对于所有数据类都没有通用的超类型(不包括Any,它是绝对所有kotlin类的通用超类型)。 因此,通常,此检查不能在编译时完成(但可以在运行时通过reflection API进行)。