2013-01-07 161 views
0

想不通爲什麼這不起作用:類型參數和上類型限制

def f[A: Double](x: A) = x/4 // error: "Double does not take type parameters" 

println(f(87.7)) 

雖然這一個工程:

def f[A <: Double](x: A) = x/4 

println(f(87.7)) 

唯一的區別是,在第一種情況下我只是指定特定的類型,並在第二個我定義類型的上限。

回答

3

這是因爲[A: Double]不是定義類型參數的正確方法。這種形式適用於定義一個 類清單 上下文綁定(新的斯卡拉2.8 - 感謝@ mhs的鏈接);但是,用於表示上下文邊界的ClassManifest[T]類型是參數化類型,因此Double不適合用作類清單。

注意,儘管引入了上下文邊界和清單是爲了解決通用數組創建問題,所以在這裏沒有用處,因爲您的函數(如上所示)與數組無關。

+0

http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala –

+0

@ mhs,oops,我錯過了,謝謝:-)我解決了我的答案。 –

+0

上下文綁定與清單無關。這是另一種方式:清單可以用在上下文邊界中。在這個問題中,沒有使用清單,也沒有在那裏預期。提問者僅將他們的語法與類型歸屬混合在一起。 – sschaef

2

當一個形式類型參數有一個在這個定義的形式:

def floob[Glorp : Fleeb](arg1: Glorp): Swish = ... 

...正是因爲這個定義只是語法糖:

def floob[Glorp](arg1: Glorp)(implicit i1: Fleeb[Glorp]): Swish = ... 

這就是所謂的上下文綁定

這解釋了爲什麼你得到一個關於Double沒有采取類型參數的診斷。

因爲這種單個冒號的使用與類型註釋和類型歸類中使用的完全無關,所以我統一使用冒號兩側的空格來編寫上下文邊界,並且絕不會使用空格寫入類型註釋或類型歸屬左邊(除非需要,當左邊的名稱是標點符號而不是字母數字時)。