2014-03-06 113 views
3
def toJson[T](obj: T) = { 
     gson.toJson(obj) 
    } 

    def toJson[T](list: Seq[T]) = { 
     toJson(seqAsJavaList(list)) 
    } 

這不會編譯。這被記錄爲一個功能(see this answer):爲什麼重載的scala函數需要返回類型?

當一個方法被重載並且其中一個方法調用另一個時。調用方法需要返回類型註釋。

問題是:爲什麼?

從上面的鏈接+一些額外的想法從同事,這裏有可能的原因:

  • 斯卡拉使用返回類型,以及確定重載方法。這是這種情況,爲什麼它被束縛? (例如,Java不使用返回類型)
  • 部分函數 - 如果其中一個方法沒有參數,另一個方法沒有參數,toJson()可能被視爲部分函數,​​所以不確定是否返回類型爲字符串或功能

我知道這是指定的返回類型的人最好的做法,但爲什麼實際上是上面的代碼中沒有編制,如果返回類型推斷不夠好,爲什麼首先呢?

+0

你的意思是第二個叫'gson'嗎?正如它所寫,它是無限遞歸的。 – joescii

+0

@barnesjd:如果'seqAsJavaList'有任何指示,它不是 - 'java.util.List'不是'Seq [T]'。 –

+0

哦,對了......在這種情況下,它稱爲另一個功能,這是他的問題。謝謝 – joescii

回答

1

可能不是主要原因,但請注意,另一個原因是明顯的參數給出如下:

當一個方法是遞歸的。

的問題是,依賴於「呼叫」功能的返回類型,呼叫可以是到它的同名,或往自己(即遞歸)。

比方說:

trait C 

class A extends C 

def a(obj: A) = {2} 

現在考慮:

def a[T <: C](obj: T): Int = { 
a(obj) 
} 

a(new A) //an Int, 2 

與:

def a[T <: C](obj: T): Any = { 
a(obj) 
} 

a(new A) //infinite recursion 

由於推斷遞歸函數的返回類型爲有限時間不可判定在一般,推斷返回n類型的「呼叫」功能也是有限時間不可解釋的一般

相關問題