私はKotlinで書かれたシールクラス、持っている:Kotlin密閉クラスをコンストラクタに渡すときにScalaコンパイラがエラーを表示するのはなぜですか?
sealed class Schema {
class RecordSchema(val fields: List<Field>): Schema()
class ArraySchema(val elementSchema: Schema): Schema()
...
}
、パラメータとしてRecordSchema
を取る別のクラス:Scalaで
class Enrichment(config: Config, val schema: RecordSchema) { ... }
を私は他のものの間でそのクラスを持っています、 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])
全体を、私はなぜこれが起こっているのか分かりません。私がコンストラクタをネストされたクラスではなくパラメータとして親クラスにすると、コンパイルがうまくコンパイルされます(これは私の回避策です)。私がKotlinではなくJavaでソースコードを書いたことを除いて、私が同じタイプのことをするならば、このエラーは起こりません。私はJava 1.8、Kotlin 1.0.4、Scala 2.11.8を使用しています。
UPDATE:ここ
が実証されたバグ: https://github.com/mjburghoffer/scala-kotlin-innerclass-bug/tree/master
私は 'val recordSchema:Schema = schemas.getSchema(id)'が必要だと思います。 – pedrofurla
いいえ、コンパイラエラーをそのステートメントに移動します。これは、2番目のエラーと同様のエラーメッセージです。 – Burg
あなたは 'schemas.getSchema(id)'の 'schemas'の宣言と実装(または少なくともメソッドシグネチャ)できますか? – pedrofurla