2

Scalaで実装したいJavaインターフェースがあります。インターフェイスには、次のメソッド宣言が含まれています。

  public Boolean existsTable(String tableId);

私のScala実装は次のとおりです。

  override def existsTable(tableId: String): Boolean = {
    val dbmeta = connection.getMetaData()
    val dbtables = dbmeta.getTables(null, null, channelId, null)
    if (dbtables.next())
      // table exists
      return true
    else
      return false
  }

何らかの理由で、「タイプ (tableId: String)Boolean の trait xyz でメソッド existsTable をオーバーライドしています。メソッド existsTable には互換性のない型があります」というエラーが表示されます。

しかし、戻り値の型は単なるブール値であるため、互換性のない型がどこにあるのか本当にわかりませんか?

ご挨拶。

PS: このメソッドは、インターフェイスを実装していなかったときに、以前と同じように機能していたので、メソッド自体にエラーはないはずです。私が苦労しているのは、Scala での Java インターフェイスの実装だけです。

4

2 に答える 2

3

コメントに示されているように、これが機能しない理由は、Scala のブール値が Java のブール値と同じではないためです。これを修正する簡単な方法は次のとおりです。

import java.lang.{Boolean => JBoolean}

override def existsTable(tableId: String): JBoolean

型に別名を付けることで、何を返すつもりだったのかがもう少し明確になります。もちろん、次のように定義することもできます。

override def existsTable(tableId: String): java.lang.Boolean
于 2013-06-13T15:03:13.183 に答える
2

問題は、Scala のが Java のではなく Javaの にBoolean対応していることです。Java の戻り値の型を変更しても、Scala のままにしておくと、動作するはずです。booleanBooleanbooleanBoolean

Scala は、すべてのプリミティブ型を実際のオブジェクトのレベルに上げ、コンパイラが使用方法に応じて必要に応じてそれらをボックス化/ボックス化解除することを決定できるようにします。一方、Java では、プリミティブ型の 2 つの表現が維持されます。プリミティブ型自体 (小文字) とボックス化された表現 (大文字) です。

于 2013-06-13T15:03:02.980 に答える