2013-04-08 13 views
6

JavaとScalaの統合に関する問題です。私は物事をより明確にするために少し簡略化しました。はA [T]をATに暗黙的にキャストできません。ここでA [T]はATを延長します

は、私は2つのクラスは、Javaで書かれています:

Javaでは
class A<T>{} 

class AT extends A<Boolean> {} 

I持って次のようにクラスを使用する方法:

public A<Boolean> a(){ 
    return new AT(); 
} 

は、私は同じことをしたいと思いますスカラ。しかし、以下のコードはコンパイルされません。

def a(): A[Boolean] = { 
    return new AT(); 
} 

メッセージは言う: "型の不一致を、見つけ:org.rarry.sample.A [ブール]:org.rarry.sample.ATが必要な" それはそうである理由

誰が説明することができます、とそれについてどうやって行くの?

答えて

5

コードがコンパイルされない理由を理解するには、最初に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() 
関連する問題