使用charts4j库时Kotlin展开运算符无法将数组转换为vararg参数的问题求助
我来帮你搞定这个问题,先梳理下你遇到的两个核心问题,再给出具体的解决办法:
问题原因分析
关于
List<? extends Number>的误解:
Java的List<? extends Number>在Kotlin里对应的是协变类型List<out Number>,但你不需要专门创建out Number类型的列表——Kotlin的List<Double>本身就满足这个要求(因为Double是Number的子类,且List在Kotlin里默认是协变的),所以直接传ArrayList<Double>给接受List<? extends Number>的方法是完全可行的。可变参数
double...的类型不匹配:
你尝试用*list.toTypedArray()展开数组,但这里的问题是:Java的double...对应的是基本类型数组double[],而list.toTypedArray()返回的是Kotlin的Array<Double>(装箱后的对象数组,对应Java的Double[]),两者类型不兼容,所以展开运算符无法被正确识别。
具体解决方案
方案一:直接使用List参数的重载方法
charts4j的Data.newData提供了接受List<? extends Number>的重载,所以你可以直接把创建好的ArrayList<Double>传入,代码更简洁:
val list = ArrayList<Double>() for (i in 1..100) { println(i) list.add(i.toDouble()) } val plot: Plot = Plots.newPlot(Data.newData(list)) // 直接传List val chart: LineChart = GCharts.newLineChart(plot) val url: String = chart.toURLString() print(url)
方案二:转换为基本类型数组使用可变参数
如果一定要用可变参数的方式,需要把List<Double>转换为Kotlin的DoubleArray(对应Java的double[]基本类型数组),再用展开运算符传入:
val list = ArrayList<Double>() for (i in 1..100) { println(i) list.add(i.toDouble()) } val doubleArray = list.toDoubleArray() // 转换为基本类型数组 val plot: Plot = Plots.newPlot(Data.newData(*doubleArray)) // 正确展开基本类型数组 val chart: LineChart = GCharts.newLineChart(plot) val url: String = chart.toURLString() print(url)
这两种方案都能解决你遇到的问题,推荐用方案一,代码更直观简洁。
内容的提问来源于stack exchange,提问作者kradicati

