【发布时间】:2020-08-19 17:11:00
【问题描述】:
我有一个函数,它采用两种可能类型的参数metadata:Metadata1 或 Metadata2。我正在尝试编写一个可用于两者的实用程序函数,因为有大量的代码重用。它们都有一个 DataPoint 对象列表,每个对象都有 name() 方法。
我认为在我的代码中 Kotlin 会使用类型推断来知道 dataPoints 只能是两种都具有 DataPoint.name() 方法的类型之一,但我得到的是“未解析的引用:名称”。我怎样才能使这个函数足够通用以适用于 Metadata1 和 Metadata2?
var dataPoints: List<Any>
if (metadata is Metadata1) {
dataPoints = metadata.metadata1().dataPoints()
} else {
dataPoints = (metadata as Metadata2).metadata2().dataPoints()
}
if (data.size > 1) {
textView.test = dataPoints.fold("")
{ x, dataPoint ->
x + dataPoint.name() + " \n" // unresolved reference: name
}
}
【问题讨论】:
-
不,Kotlin 没有联合类型。另外,您声明了
List<Any>。这两个类有共同的接口还是超类? -
您应该创建两个类都实现的接口(例如,定义了
name()函数)。 -
Metadata1和Metadata2必须 有一些共享的超类型:接口、类、密封类(这将保证它始终是这两者之一).. .没有它,你基本上无能为力。 (好吧,您可以创建一个密封的类来保存Metadata1或Metadata2,但这会在调用方方面增加更多工作。) -
我最终通过将 dataPoints 映射到 Metadata1 和 Metadata2 的单个共享类型并将其作为共享类型参数直接传递给函数来解决了这个问题。谢谢大家!
-
两个类都可能有一个方法称为
name(),但如果它们继承自同一个类或接口,它只是同一个方法。否则,它们是完全不同的、不相关的方法,只是碰巧拼写相同。
标签: kotlin