【发布时间】:2016-09-27 00:17:48
【问题描述】:
我有一个用 Kotlin 编写的密封类:
sealed class Schema {
class RecordSchema(val fields: List<Field>): Schema()
class ArraySchema(val elementSchema: Schema): Schema()
...
}
还有一个以RecordSchema为参数的类:
class Enrichment(config: Config, val schema: RecordSchema) { ... }
在 Scala 中,我有一个类,除其他外,它获取 RecordSchema 的实例,然后创建 Enrichment 的实例。
object Job {
def main(args: Array[String]): Unit = {
/// some initializing of resources... and then...
val recordSchema = schemas.getSchema(id) // type is Schema.RecordSchema
val enrichment = Enrichment(config, recordSchema) // this is where scalac errors out
}
}
scala 编译器最终打印此错误消息:
Error:(52, 62) type mismatch;
found : com.companyname.enricher.schemas.com.companyname.enricher.schemas.com.companyname.enricher.schemas.
required: com.companyname.enricher.schemas.(some other)com.companyname.enricher.schemas.com.companyname.enricher.schemas.
val enrichment = new Enrichment(config, recordSchema)
如果我使用asInstanceOf 投射recordSchema,我会得到另一个不太有用的错误:
Error:(52, 62) type mismatch;
found : com.companyname.enricher.schemas.Schema.RecordSchema
required: com.companyname.enricher.schemas.com.companyname.enricher.schemas.
val enrichment = new Enrichment(config, recordSchema.asInstanceOf[RecordSchema])
总的来说,我不知道为什么会这样。如果我让构造函数将父类作为参数而不是嵌套类,它编译得很好(这是我现在的解决方法)。如果我做同样类型的事情,除了用 Java 而不是 Kotlin 编写源代码,这个错误就不会发生。我正在使用 Java 1.8、Kotlin 1.0.4、Scala 2.11.8。
更新:
这里显示的错误: https://github.com/mjburghoffer/scala-kotlin-innerclass-bug/tree/master
【问题讨论】:
-
我猜你需要
val recordSchema:Schema = schemas.getSchema(id),这样行吗? -
否,将编译器错误移至该语句,该错误消息与第二个错误类似。
-
你能把
schemas的声明和schemas.getSchema(id)的实现(或至少方法签名)吗? -
是的,当然,我只是在包装一个模式注册表库。试图减少原始帖子中的噪音 - 签名只是
fun getSchema(id: Int): Schema.RecordSchema。