【问题标题】:Kotlin generic functionKotlin 泛型函数
【发布时间】:2020-01-12 19:28:02
【问题描述】:

我编写了一个 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 泛型之间的主要区别,将不胜感激。

【问题讨论】:

    标签: generics kotlin


    【解决方案1】:

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

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

    在 Kotlin 中,这里的问题是,加法最终是一个加法运算,需要知道它是否是长整数、浮点数等的加法。而且由于泛型类型被擦除,并且只有一个 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())
    }
    

    【讨论】:

    • 你能演示一下如何在类范围之外编写这个函数吗?
    【解决方案2】:

    在 C++ 中,为每个专业化生成模板代码,然后进行编译。在这里它的工作方式不同。没有生成,所有情况都调用您编写的相同代码。 在 kotlin 中没有干净的方法可以做同样的事情。甚至这段代码也会报错:

    val x:Number = 1.0;
    val z:Float = 2.0f;
    
    val r = x + z;
    

    Number 类没有定义任何加号运算符函数。您需要手动检查您正在处理的类型,然后调用 plus 函数操作。在错误消息中,我想您收到的 plus() 函数都不适合您的情况。

    Check this answer 或谷歌“kotlin 通用数字函数”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      相关资源
      最近更新 更多