2014-09-04 37 views
0

我實現的(Int) => String)推導並重寫toString方法是這樣的:爲什麼toString方法上scala.Function1和scala.Function2有括號

object A extends ((Int) => String) { 
    override def toString: String = "A" 
    def apply(int: Int): String = int.toString 
} 

的IntelliJ IDEA表示toString方法正在從重寫(和Scala IDE一樣)。和IntelliJ還顯示以下警告,表明空括號必須被添加到toString方法由於Function1.toString聲明包括空括號(斯卡拉IDE不顯示此警告):

空,括號Scala的方法重載,作爲參

約定是如果方法有側面 影響,則包括括號。根據Liskov替換原則,由於 重寫方法是空白的,因此重寫方法也必須是 聲明爲具有副作用的方法。 *請參閱編程在斯卡拉 ,5.3運營商都在斯卡拉包裝方法

然後我去了ScalaDoc並檢查Function1source),Function2source)和PartialFunctionsource)。在用於2.11.2,Function1Function2源代碼中的每個覆蓋toString方法,並且包括空括號(和PartialFunction只是使用Function1的覆蓋)。因此,考慮到雙方Function1Function2聲明String文字爲toString方法,我不明白爲什麼會括號已列入這兩個類文件的源代碼。

我失去了什麼明顯的事情,這是合理的toString方法使用括號的?或者IntelliJ警告不正確?或者,如果IntelliJ警告是正確的,爲什麼Scala IDE不會顯示與IntelliJ相同的警告?

回答

1

override def f覆蓋def f()被假定爲有括號,在規範中。

你引用的IntelliJ消息說,有一個「慣例」,你應該包括括號記錄,該方法不只是一個訪問,但可能有副作用。

並非所有人都同意或符合該標誌性的「慣例」。

toString的情況下,該約定尤其爲空,因爲許多toString方法是副作用的,例如迭代器初始化狀態。

我剛纔問這個的ML最近:

https://groups.google.com/d/msg/scala-internals/ahNPTB6-P3M/1pPyptaH6coJ

我回答在後續我自己的問題:

http://www.scala-lang.org/files/archive/spec/2.11/05-classes-and-objects.html#overriding 

一個特殊的規則顧慮參的方法。 ... f也假定 有一個空的參數列表。

這意味着您可以將parens置於重載定義之外。

例如,

scala> def f = 42 
f: Int 

scala> f() 
<console>:9: error: Int does not take parameters 
       f() 
      ^

scala> class X { def f() = 42 } 
defined class X 

scala> class Y extends X { override def f = 43 } 
defined class Y 

scala> new Y().f() 
res1: Int = 43 

Y.f具有空PARAM列表。

由於Object.toString()有一個空的參數列表,所以每個覆蓋,包括覆蓋Any.toString

(Java的爲理由括號提供的,在被稱爲「空應用」轉換toString()被引用。)

+0

Tysvm回答。我已經閱讀了三次答案,並且還閱讀了Google線程。我仍然無法自信地得出結論。那麼,這是簡短的答案嗎?重寫toString方法時不需要括號,這意味着IntelliJ的警告不正確。如果是這樣的話,如果你可以把這個(或者用你自己的話說)放在頂部作爲總結(或tl; dr),我會接受你的答案,這樣未來的讀者可以很快得出結論,而不必深入閱讀。如果不是,請幫我理解我最後一段中對這三個問題的回答。 – chaotic3quilibrium 2014-09-04 12:37:42

+0

如果答案是可以捨棄括號,你知道他們爲什麼不離開scala.Function1和scala.Function2(特別是因爲他們被分配一個字符串文字)嗎? – chaotic3quilibrium 2014-09-04 12:45:05

+1

我用了更強的單詞。 – 2014-09-04 15:12:39

相關問題