【问题标题】:Kotlin generic class to math numbersKotlin 通用类到数学数字
【发布时间】:2018-11-30 15:35:23
【问题描述】:

所以我只是用 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)
}

【问题讨论】:

  • var num1+num2 不是有效的 Kotlin 语法。
  • var numbersResulttt = num1 + num2
  • 在这两种情况下都不起作用
  • 你能澄清一下你所说的“不起作用”是什么意思吗?您期望/希望代码做什么?您遇到了什么实际问题?
  • 请编辑您的问题以显示您尝试编译的确切代码,然后我们可以解释问题所在。

标签: java class generics kotlin


【解决方案1】:

上面的代码无法编译,因为您尝试在泛型类中使用+ 运算符,但泛型类不知道您正在处理数字。就编译器而言,DE 类型可以是任何类型,例如两个完全不相关的对象。所以不能把它们加在一起。

当你有一个类以泛型方式对给定类型的对象进行操作时,应该使用泛型类。例如,标准的List 类型是一个泛型类,因为它可以存储给定类型的对象列表。如果您构造List&lt;String&gt; 的实例,该实例可以存储字符串列表。如果您构造一个List&lt;Int&gt; 的实例,该实例将存储一个整数列表。

在您的情况下,您正在做一些更具体的事情,仅适用于某些类型,例如数字。现在,您可以在创建泛型类时说它可以操作的对象类型是有限的,例如实现了一些接口。所以在你的情况下,如果你知道这个类总是使用数字,你可以说你的类只对Number 的子类进行操作,例如

class Third<D: Number, E: Number>

IntLong等都是Number的子类。但是,在这种特定情况下,这对您没有多大帮助,因为 + 运算符不在 Number 基类上:它在每个子类上的实现方式不同。指定 DE 类型必须是 Number 的子类将只允许您调用存在于 Number 类本身上的方法。例如,您可以这样做:

val test = num1.toDouble() + num2.toDouble()

因为toDouble 被声明为Number 类的方法。但是我认为这不是一个好主意,真的,因为任何类型的转换都可能导致问题,例如四舍五入等

也许在这种特殊情况下,泛型不是正确的解决方案。如果您只是想了解泛型,也许可以找到一个不同的示例,或者创建一些从通用基类派生的自定义类,然后使用它。

【讨论】:

  • 所以当我应该使用泛型类..时,我不太了解它
  • 已更新我的答案。希望它能回答你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2016-12-12
  • 2021-12-15
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多