gpt4 book ai didi

generics - Kotlin 泛型函数

转载 作者:行者123 更新时间:2023-12-02 12:52:38 27 4
gpt4 key购买 nike

我写了一个Complex表示复数的泛型类,并希望能够将内部数字存储为用户传入的类型。还有一个 add_complex()函数将两个复数相加。

class Complex<T: Number>(val real:T, val imagine:T)

fun<T:Number> add_complex(l:Complex<T>, r:Complex<T>): Complex<T>
{
return Complex(l.real+r.real, l.imagine+r.imagine)
}

fun main()
{
var x=Complex<Int>(2,3)
var y=Complex<Int>(4,5)
var sum=add_complex(x,y)
print("${sum.real},${sum.imagine}i")
}

编译器给出了一长串关于可能匹配 plus 的错误消息。功能。但我不知道问题出在哪里,并且 kotlin 引用并没有提供太多关于泛型函数的信息。而且我来自C++,对C++模板有一个粗略的了解。如果有人能解释 C++ 模板和 kotlin 泛型之间的主要区别,将不胜感激。

最佳答案

与 C++ 模板的不同之处在于,在 C++ 中,编译器只是简单地替换模板类型来生成新的专用类型、新函数等。

所以 X 和 X 最终成为两个新类,而在 Kotlin 中只有一个 X 类,此外在 Kotlin 中,在运行时泛型类型被删除(即在运行时 Integer 和 Double 简单地消失,它们只有编译器需要)。在这里,C++ 将简单地创建一个 Complex 类并使用它。

在 Kotlin 中,这里的问题是加法最终是一个加法运算,需要知道它是否是 longs 的加法,float 等的加法。由于泛型类型被删除,并且只有一个 Complex 类,它需要处理所有的可能性。因此,必须更改您的代码以处理每种此类情况。或者默认为单一类型,如下所示:

class Complex<T: Number>(val real:T, val imagine:T) {
fun add(o: Complex<T>): Complex<Double> {
var r = real.toDouble() + o.real.toDouble()
var i = imagine.toDouble() + o.imagine.toDouble()
return Complex(r, i)
}
}

或者
fun<T:Number> add_complex(l:Complex<T>, r:Complex<T>): Complex<Double> {
return Complex(l.real.toDouble() +r.real.toDouble(), l.imagine.toDouble()+r.imagine.toDouble())
}

关于generics - Kotlin 泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59699769/

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