Kotlin类型不匹配错误:函数参数传递问题排查
Kotlin温度控制函数调用的类型不匹配问题
我在学习Kotlin基础时遇到了温度控制相关的问题,调用printFinalTemperature函数时,传入conversionFormula相关参数始终出现类型不匹配错误:Type mismatch: inferred type is Double but (Double) -> Double was expected。以下是我的代码:
fun main() { var temp : Double = 10.0 fun celsiusToFahrenheit(celsius : Double): Double { return 9/5 * (celsius) + 32 } fun kelvinToCelsius(kelvin : Double):Double { return kelvin - 273.15 } fun conversionFormula(fahrenheit: Double): Double { var fiveNine :Double = 0.56 var result :Double = (fiveNine*(fahrenheit - 32.0) + 273.15) return result } printFinalTemperature(temp, "Kelvin", "Celsius", conversionFormula(temp)) } fun printFinalTemperature( initialMeasurement: Double, initialUnit: String, finalUnit: String, conversionFormula: (Double) -> Double ) { val finalMeasurement = String.format("%.2f", conversionFormula(initialMeasurement)) // two decimal places println("$initialMeasurement degrees $initialUnit is $finalMeasurement degrees $finalUnit.") }
请问我忽略了什么?
错误原因
你调用printFinalTemperature时,传入的conversionFormula(temp)是执行函数后返回的Double类型结果,但该函数的第四个参数要求的是一个接收Double并返回Double的函数类型(即函数引用),这就导致了类型不匹配。
解决方案
直接传入函数名conversionFormula即可,不需要加括号和参数,这样传递的是函数本身,而非函数执行后的结果:
修改后的main函数中调用代码:
printFinalTemperature(temp, "Kelvin", "Celsius", conversionFormula)
另外补充两个小问题:
celsiusToFahrenheit函数里的9/5是整数除法,结果为1,应该改成9.0/5或者1.8才能得到正确的浮点运算结果。conversionFormula里的fiveNine用5.0/9会比硬写0.56更准确,避免精度损失。
修改后的完整示例代码:
fun main() { var temp : Double = 10.0 fun celsiusToFahrenheit(celsius : Double): Double { return 9.0/5 * celsius + 32 } fun kelvinToCelsius(kelvin : Double):Double { return kelvin - 273.15 } fun conversionFormula(fahrenheit: Double): Double { val fiveNine = 5.0/9 return fiveNine * (fahrenheit - 32.0) + 273.15 } printFinalTemperature(temp, "Kelvin", "Celsius", conversionFormula) } fun printFinalTemperature( initialMeasurement: Double, initialUnit: String, finalUnit: String, conversionFormula: (Double) -> Double ) { val finalMeasurement = String.format("%.2f", conversionFormula(initialMeasurement)) println("$initialMeasurement degrees $initialUnit is $finalMeasurement degrees $finalUnit.") }
内容的提问来源于stack exchange,提问作者Keb_Tse
相关产品推荐
相关产品推荐

