想不通爲什麼這不起作用:類型參數和上類型限制
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))
唯一的區別是,在第一種情況下我只是指定特定的類型,並在第二個我定義類型的上限。
想不通爲什麼這不起作用:類型參數和上類型限制
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))
唯一的區別是,在第一種情況下我只是指定特定的類型,並在第二個我定義類型的上限。
這是因爲[A: Double]
不是定義類型參數的正確方法。這種形式適用於定義一個
類清單
上下文綁定(新的斯卡拉2.8 - 感謝@ mhs的鏈接);但是,用於表示上下文邊界的ClassManifest[T]
類型是參數化類型,因此Double
不適合用作類清單。
注意,儘管引入了上下文邊界和清單是爲了解決通用數組創建問題,所以在這裏沒有用處,因爲您的函數(如上所示)與數組無關。
當一個形式類型參數有一個在這個定義的形式:
def floob[Glorp : Fleeb](arg1: Glorp): Swish = ...
...正是因爲這個定義只是語法糖:
def floob[Glorp](arg1: Glorp)(implicit i1: Fleeb[Glorp]): Swish = ...
這就是所謂的上下文綁定。
這解釋了爲什麼你得到一個關於Double
沒有采取類型參數的診斷。
因爲這種單個冒號的使用與類型註釋和類型歸類中使用的完全無關,所以我統一使用冒號兩側的空格來編寫上下文邊界,並且絕不會使用空格寫入類型註釋或類型歸屬左邊(除非需要,當左邊的名稱是標點符號而不是字母數字時)。
http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala –
@ mhs,oops,我錯過了,謝謝:-)我解決了我的答案。 –
上下文綁定與清單無關。這是另一種方式:清單可以用在上下文邊界中。在這個問題中,沒有使用清單,也沒有在那裏預期。提問者僅將他們的語法與類型歸屬混合在一起。 – sschaef