2016-09-27 6 views
0

私は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

+1

私は 'val recordSchema:Schema = schemas.getSchema(id)'が必要だと思います。 – pedrofurla

+0

いいえ、コンパイラエラーをそのステートメントに移動します。これは、2番目のエラーと同様のエラーメッセージです。 – Burg

+1

あなたは 'schemas.getSchema(id)'の 'schemas'の宣言と実装(または少なくともメソッドシグネチャ)できますか? – pedrofurla

答えて

0

Kotlinが、この場合のクラスの異なる番号を生成ように見えます。私はJavaとKotlinソースをコンパイルし、Javaに追加のファイルParentSealedJava$1.classがあることを発見しました。 ParentのバイトコードとSealedクラスのJavaとKotlinはかなり同じです(私はjavap -cを使ってバイトコードを検査します)。だから、Scalaコンパイラは何とかKotlinのこの欠けているファイルに依存していると思います。

+0

KotlinやScala、あるいはその両方のバグかどうかは分かりませんが、最終的にはバグのようです。 ScalaとKotlinの両方のチームに提出されました。修正点があるかどうかを確認します。 – Burg

+1

KotlinクラスはJavaで動作するので、これはscalacのバグだと思う。 – IRus

関連する問題