所以我只是用Kotlin语言编程学习泛型类,我只是用泛型类编写数学数字的代码,但我不知道问题到底在哪里
我的守则:
class Third<D, E> {
var num1: D? = null
var num2: E? = null
fun print_math_formula(b: D, c: E) {
val code_of_Formula: Int = 1
val num1 = b
val num2 = c
var num1+num2
}
}
fun main(args: Array<String>){
var obj4 = Third<Int, Int>()
obj4.print_math_formula(5, 6)
}发布于 2018-11-30 15:45:22
上面的代码不会编译,因为您试图在泛型类中使用+操作符,但是泛型类不知道您使用的是数字。就编译器而言,类型D和E可以是任何东西,例如两个完全无关的对象。所以它不能把它们加在一起。
当您的类以泛型方式操作给定类型的对象时,应该使用泛型类。例如,标准List类型是一个泛型类,因为它可以存储给定类型的对象列表。如果构造List<String>实例,则该实例可以存储字符串列表。如果构造List<Int>实例,则该实例存储整数列表。
在你的例子中,你正在做一些更具体的事情,它只适用于某些类型,例如数字。现在,在创建泛型类时,您可以说它可以操作的对象类型是有限的,例如实现了一些接口。所以在你的例子中,如果你知道这个类总是和数字一起工作,你可以说你的类只在Number的子类上操作。
class Third<D: Number, E: Number>Int、Long等都是Number的子类。但是,在这种特殊情况下,这不会对您有多大帮助,因为+操作符不在Number基类上:它在每个子类上的实现方式不同。如果指定类型D和E必须是Number的子类,则只允许调用存在于Number类本身上的方法。例如,您可以这样做:
val test = num1.toDouble() + num2.toDouble()因为toDouble被声明为Number类上的一个方法。然而,我不认为这是一个伟大的想法,真的,因为任何形式的转换都会引起问题,例如舍入等等。
也许在这种特殊情况下,泛型不是正确的解决方案。如果您只是想了解泛型,可以找一个不同的例子,或者创建一些从公共基类派生出来的自定义类,然后使用它。
https://stackoverflow.com/questions/53560522
复制相似问题