kotlin 允许引用用Any声明的类中的变量

js81xvg6  于 2023-01-17  发布在  Kotlin
关注(0)|答案(1)|浏览(110)

我有一个函数,它可以是许多不同的类,包含许多字段(open,high,low,close),类包含其他字段,但是我不想为每个要Map的类写一个函数,有没有一种方法,允许指定字段而不得到“未解析的引用”

fun createTA4JBarsFromAlgobars(timebars: List<Any?>, name: String): BaseBarSeries? {

    val series = BaseBarSeriesBuilder().withName(name).build()

//all it.unixSecond etc. Get unresolved reference with compiling

    timebars.map { series.addBar(utilService.unixtimeToZoneDateTime(it.unixSecond), it.open, it.high, it.low, it.close, it.volume) }

    return series

}
lmvvr0a8

lmvvr0a81#

有理由拥有List<Any>是极其罕见的。(在使用Java和Kotlin的12年中,我不记得曾经这样做过。)如果您想从列表中的所有项中获取某个属性,应该让它们都继承自定义这些属性的公共接口。然后你可以创建一个接口类型的列表,并放入各种不同类的示例,这些示例都符合该接口。例如:

interface TimeBar {
    val unixSecond: Long
    val open: Float
    val close: Float
    val high: Float
    val low: Float
    val volume: Float
}

// Make all your various classes for your list implementers of the above interface.
// Then make your list a `List<TimeBar>`.

在您的情况下,如果每个类类型没有highlow等属性,而是以各种不同的方式添加到图表中,则可以创建一个公共接口,用于将示例添加到图表中,例如:

interface TimeBar {
    fun addToBaseBarSeries(series: BaseBarSeries)
}

// in each of your classes, some implementation of the above function:
override fun addToBaseBarSeries(series: BaseBarSeries) {
    series.addBar(utilService.unixtimeToZoneDateTime(unixSecond), open, high, low, close, volume)
}

你也不正确地使用了map。它不是为了产生副作用。它是为了创建一个不同类型的新列表。你应该使用for循环来代替。

相关问题