2013-04-08 73 views
6

問題與Java和Scala之間的集成有關。爲了使事情更清楚,我簡化了一下。不能隱式地將A [T]轉換爲AT,其中A [T]擴展AT

我已經用Java編寫的兩個類:

class A<T>{} 

class AT extends A<Boolean> {} 

在Java中我有一個使用了類以下列方式方法:

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

我願做同樣的事情在斯卡拉。但下面的代碼不能編譯。

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

的消息稱: 「類型不匹配;發現:org.rarry.sample.AT要求:org.rarry.sample.A [布爾]」

任何人可以解釋爲什麼它是如此,和如何去做?

回答

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() 
相關問題