我實現的(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並檢查Function1(source),Function2(source)和PartialFunction(source)。在用於2.11.2,Function1
和Function2
源代碼中的每個覆蓋toString
方法,並且包括空括號(和PartialFunction
只是使用Function1
的覆蓋)。因此,考慮到雙方Function1
和Function2
聲明String
文字爲toString
方法,我不明白爲什麼會括號已列入這兩個類文件的源代碼。
我失去了什麼明顯的事情,這是合理的toString
方法使用括號的?或者IntelliJ警告不正確?或者,如果IntelliJ警告是正確的,爲什麼Scala IDE不會顯示與IntelliJ相同的警告?
Tysvm回答。我已經閱讀了三次答案,並且還閱讀了Google線程。我仍然無法自信地得出結論。那麼,這是簡短的答案嗎?重寫toString方法時不需要括號,這意味着IntelliJ的警告不正確。如果是這樣的話,如果你可以把這個(或者用你自己的話說)放在頂部作爲總結(或tl; dr),我會接受你的答案,這樣未來的讀者可以很快得出結論,而不必深入閱讀。如果不是,請幫我理解我最後一段中對這三個問題的回答。 – chaotic3quilibrium 2014-09-04 12:37:42
如果答案是可以捨棄括號,你知道他們爲什麼不離開scala.Function1和scala.Function2(特別是因爲他們被分配一個字符串文字)嗎? – chaotic3quilibrium 2014-09-04 12:45:05
我用了更強的單詞。 – 2014-09-04 15:12:39