gpt4 book ai didi

generics - Kotlin:如何将集合传递给函数的泛型类型

转载 作者:行者123 更新时间:2023-12-02 08:03:59 25 4
gpt4 key购买 nike

我有这个抽象函数:

    abstract fun <T> updateValue(value: T)

现在我想要一个子类用通用类型的集合覆盖它:

override fun <List<Int>> updateValue(value: List<Int>)

这不起作用。基本类型工作得很好(String、Int 等),但是当我想使用集合时,我不知道正确的语法。这样就可以了:

override fun <String> updateValue(value: String)

最佳答案

您不能使用固定参数覆盖泛型函数,相反,您可以在类或接口(interface)上使用类型参数来实现它。例如

abstract class BaseClass<T> {
abstract fun updateValue(value: T) : Unit
}

///class to accept _only_ List<Int>
class ListClass<List<Int>> {
override fun updateValue(value: List<Int>) { /*...*/ }
}

/// class to accept _only_ String
class StringClass<String> {
override fun updateValue(value: String) { /*...*/ }
}

声明泛型函数时的基本原理如下,例如fun <T> updateValue(value: T)这意味着它应该适用于所有可能的T 。它不会进行模式匹配来找到最合适的匹配。

您可以尝试检查泛型函数实现中的类型以支持特定情况,但一般来说,对于集合类来说可能会很困难,因为 type erasure .

fun <T> updateValue(value: T) {
when (value) {
is String -> handleStringValue(value)
is List<*> -> handleListValue(value)
else -> handleDefault(value)
}
}

你无法分辨List<Int>来自List<String>这里。安inline funreified泛型可能help .

关于generics - Kotlin:如何将集合传递给函数的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55352296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com