gpt4 book ai didi

kotlin - 如何使用函数中的泛型来避免重复代码?

转载 作者:行者123 更新时间:2023-12-01 22:51:27 25 4
gpt4 key购买 nike

我有一个关于在 Kotlin 中使用泛型的具体问题。

我想创建一个以通用 T 作为参数的函数。它使用它从以下类之一分配 name:Class1Class2 到局部变量 testString

不幸的是,这只有在我使用 if 条件检查参数类型时才有可能。

这会导致重复代码。如果我尝试避免这种情况并使用第 12 行,我会在编译期间收到此错误:Unresolved reference: name

当您要使用的类具有同名的相同属性时,Kotlin 是否可以避免 if 条件并仅使用一次 testString 赋值?

代码:

fun main() {
val class1 = Class1("Foo1")
val class2 = Class2("Foo2")
}

class Class1(val name: String)
class Class2(val name: String)

fun <T> doStuff(classOneOrTwo: T) {
var testString: String

testString = classOneOrTwo.name //not working: Unresolved reference: name

if (classOneOrTwo is Class1) {
testString = classOneOrTwo.name
}
if (classOneOrTwo is Class2) {
testString = classOneOrTwo.name
}
}

最佳答案

这里不需要泛型。

您可以只编写一个接口(interface),要求其实现者具有 name 属性。

interface HasName {
val name: String
}

Class1Class2 应该实现接口(interface):

class Class1(override val name: String): HasName
class Class2(override val name: String): HasName

那么doStuff可以写成:

fun doStuff(classOneOrTwo: HasName) {
var testString = classOneOrTwo.name
// ...
}

可以使doStuff通用:

fun <T: HasName> doStuff(classOneOrTwo: T) {
var testString = classOneOrTwo.name
// ...
}

但是这样做并没有特别的收获。

当您想建立某种“链接”时,无论是在参数之间,还是在参数与返回类型之间,非具体化* 泛型都是最有帮助的。例如,如果您的方法应该返回与它需要的类型相同的东西:

fun <T> doStuff(foo: T): T { ... }

或者你的方法有两个参数,第二个参数必须是第一个参数的元素类型,是一个可变列表:

fun <T> doStuff(list: MutableList<T>, t: T) { ... }

* 这一段并不完全适用于reified generics ,它们本身可能很有用。

关于kotlin - 如何使用函数中的泛型来避免重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74273087/

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