2010-07-21 55 views
6

在我自己的代碼和衆多郵件列表發帖中,我注意到由於Nothing被推斷爲另外兩種類型的最小上限而導致混淆。在什麼情況下推斷什麼都不可取?

答案可能是顯而易見的,你*,但我很懶,所以我要問你*:

  • 在什麼情況下以這種方式推斷沒有最希望的結果?

  • 在這種情況下,編譯器會拋出一個錯誤還是一個警告,除非被某種註釋覆蓋了是否合理?

*複數

回答

2

這是不可能推斷Nothing作爲兩種類型的最小上限,除非這兩種類型都是Nothing。當你推斷兩種類型的最小上限時,這兩種類型沒有什麼共同之處,你會得到Any(在大多數情況下,你會得到AnyRef,因爲只有當類型的值類型時纔會得到AnyIntLong

+0

對於我不清楚的問題的正確答案,現在已經足夠了。 :) – 2010-11-12 02:03:39

4

沒有什麼是一切的亞型,因此它在一定意義上的任何櫃檯的一部分,這是超強型應有盡有。沒有東西不能被實例化,你永遠不會擁有一個Nothing對象。有兩種情況(我知道的),其中沒有什麼實際的用處:

  • 從不返回(相對於不返回有用值,它將使用單位,而不是一個函數),A函數發生無限循環,無限堵塞,始終拋出異常或退出應用程序
  • 作爲指定空容器類型的方式,例如無或無。在Java中,不能爲一個通用的不可變列表創建一個Nil對象,而無需投射或使用其他技巧:如果要創建日期列表,則即使空元素也需要具有正確的類型,該類型必須是日期。作爲日期和例如整數在Java中不共享一個共同的子類型,儘管事實上你的Nil甚至沒有任何價值,但你不能創建這樣一個沒有技巧的無實例。現在Scala對所有對象都有這個共同的子類型,所以你可以將Nil定義爲object Nil extends List[Nothing],你可以用它來啓動你喜歡的任何列表。

你的第二個問題:是的,這將是有益的。我猜想已經有一個編譯器開關用於打開這些警告,但我不確定。

+0

謝謝,但我很清楚沒有什麼是好的,孤立地;我試圖弄清楚什麼時候它是有用的,它是由LUB算法推斷出來的。 – 2010-07-21 22:18:44

相關問題