2015-07-01 120 views
0

Java支持檢查異常,但默認情況下在聲明站點不變。 Scala允許使用+T-T的方差註釋,但沒有檢查異常。我目前正在設計/實現一種應該支持這兩種語言的語言,所以我想知道差異如何適用於檢查異常。檢查異常差異

interface Function[-P1, +R, E] 
{ 
    public R apply(P1 par1) throws E 
} 

應該E有什麼樣的變化註釋的,還是不變?此外,如果它有相反的方差註釋,我應該產生一個錯誤,類似於在Scala中,如果使用協變類型參數作爲函數參數類型,您會得到一個錯誤?

回答

1

這樣的事情出現全部在語言設計的時間,並且存在健全性等問題,所以花時間在語言的其他方面思考這些問題!

但是,無論如何,這取決於你的意思。讓我們假設我們有

interface IOFunction[-P1, +R, E <: IOException] extends Function[P1,R,E] 

,然後我們有

public R doIo[P1, R](f: IOFunction[P1, R, IOException]) ... 

如果什麼用戶有他們的手拋出只有MyIOException <: IOException的功能的方法?他們應該能夠使用它嗎?

如果是,那麼這就是協變性的全部內容。如果不是,它必須是IOException或沒有,然後使用不變性。

您可以對異常使用與正常返回值相同的推理。他們排序的返回值,只是不正常的。

+0

嗯,它是一種有趣的語言,升級到[90k LoC](https://github.com/Clashsoft/Dyvil)...基本上Java沒有的所有東西。但無論如何,謝謝你的回答,儘管最後一句話已經足夠了。 – Clashsoft

+0

@Clashsoft - 是的,我想它應該被視爲與返回類型相同。 – ZhongYu

+0

@Clashsoft - 可能,但是誘惑只是複製什麼樣的返回值(即協變),而不是考慮權衡。 –