You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用charts4j库时Kotlin展开运算符无法将数组转换为vararg参数的问题求助

解决Kotlin中使用charts4j创建Data对象的类型问题

我来帮你搞定这个问题,先梳理下你遇到的两个核心问题,再给出具体的解决办法:

问题原因分析

  1. 关于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>的方法是完全可行的。

  2. 可变参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:03:10