Scala中如何转换为XDDFLineChartData的内部Series成员类型
问题
在Scala中使用Apache POI 5.2.3创建PPT折线图时遇到类型转换问题。初始代码如下:
// createData returns XDDFChartData var chartData = chart.createData( ChartTypes.LINE, bottomAxis, leftAxis ).asInstanceOf[XDDFLineChartData] // addSeries returns XDDFChartData.Series var series = chartData.addSeries(bottomAxisDataSource, seriesDataSource) series.setSmooth(false)
运行后报错:
error: value setSmooth is not a member of org.apache.poi.xddf.usermodel.chart.XDDFChartData.Series
尝试将series转换为XDDFLineChartData.Series以调用setSmooth()方法,但转换代码:
chartData.addSeries(bottomAxisDataSource, seriesDataSource).asInstanceOf[XDDFLineChartData.Series]
执行后报错:
error: type Series is not a member of object org.apache.poi.xddf.usermodel.chart.XDDFLineChartData
请问该如何正确转换为目标内部成员类型?
解决方案
问题出在Scala对Java内部静态类的引用语法差异上,Apache POI 5.x中XDDFLineChartData.Series是类的内部静态类,而非对象成员,正确处理方式如下:
使用Scala的内部类引用语法:Scala中访问Java的静态内部类时,需要用
#替代.来指定内部类型,正确的类型标识是XDDFLineChartData#Series。修改后的代码示例:
var chartData = chart.createData( ChartTypes.LINE, bottomAxis, leftAxis ).asInstanceOf[XDDFLineChartData] // 转换为正确的折线图Series类型 var series = chartData.addSeries(bottomAxisDataSource, seriesDataSource) .asInstanceOf[XDDFLineChartData#Series] series.setSmooth(false)
也可以直接在变量声明时指定类型,让代码更清晰:
var chartData: XDDFLineChartData = chart.createData( ChartTypes.LINE, bottomAxis, leftAxis ).asInstanceOf[XDDFLineChartData] var series: XDDFLineChartData#Series = chartData.addSeries(bottomAxisDataSource, seriesDataSource) .asInstanceOf[XDDFLineChartData#Series] series.setSmooth(false)
原理:Java的静态内部类在Scala中属于“路径依赖类型”的范畴,使用.会被解析为访问对象的成员,而#才是正确的类内部静态类型引用方式,这是两种语言语法规则的差异导致的。
内容的提问来源于stack exchange,提问作者saviourofdp
相关产品推荐
相关产品推荐

