コードがコンパイルされない理由を理解するには、まず、Java はjava.lang.Boolean
ボックス化されたブール型を使用し、Scala は を使用することに注意してくださいscala.Boolean
。ほとんどの場合、それらのいずれかを使用したいときに、メソッドがもう一方を返す (またはメソッド引数がもう一方を必要とする) 場合、暗黙的な変換が実行され、正しい型が使用されます。
あなたが Scala で書いたメソッドa
は本当に を返しますA[java.lang.Boolean]
。A[java.lang.Boolean]
と の間に暗黙的な変換がないため、この場合A[scala.Boolean]
は自動的に戻りませんA[scala.Boolean]
。
これが事実であることを確認するために、このメソッドが問題なくコンパイルされることを確認できます。
def a: A[java.lang.Boolean] = new AT()
繰り返しになりますが、暗黙的な変換がないため、これも機能しません (以下で修正方法を確認できます)。
val instanceOfA: A[Boolean] = a
def a = new AT()
// Error: AT doesn't conform to A[Boolean]
それを修正するには、キャストすることで必要な型に暗黙的に変換できます。
implicit def toScalaABoolean(a: A[java.lang.Boolean]): A[Boolean] =
a.asInstanceOf[A[Boolean]]
a
これが完了すると、メソッドの戻り値の型を宣言する必要さえなくなります。
implicit def toDifferentBoolean(a: A[java.lang.Boolean]): A[Boolean] =
a.asInstanceOf[A[Boolean]]
val instanceOfA: A[Boolean] = a
def a = new AT()