2015-05-26 39 views
2

我在想一個很好的例子,詳細說明Ada嚴格打字和Java強打字之間的區別。 有沒有人有一個很好的例子來識別使用基於整數值的類型轉換中的這些差異?示例代碼詳細說明了Ada和Java之間的打字差異

+3

參見[*阿達爲C++或Java開發者:§5.1強類型*](http://www.adacore.com/knowledge/technical-papers/ada-for-the-c-or-java-developer /) – trashgod

+0

謝謝,正是我在找什麼! –

回答

7

從Ada的角度來看,這可能會有幫助。

類型聲明有兩種基本形式:新類型和子類型。

新類型被視爲與以前類型完全不同的類型,即使它具有相同的值範圍。新類型的對象只能分配給新類型的變量,依此類推。

子類型從現有類型派生,共享其值的一個子集,並且就分配而言被視爲本質上是相同的類型。

使用類型系統的藝術需要一點練習,而這種 - 在類型和子類型之間進行選擇 - 是一個重要的領域。它使挫折地打擊類型系統和讓程序輕鬆簡單地結合在一起的區別。

  • 聲明一個新的類型,其值指示新的東西, 你不需要或想與其他數量混合。
  • 聲明其值與現有事物相關的子類型。

一個例子:想象自動化的建築物,包括它的升降系統:

type Floor is new Integer range -3 ..135; 

有幾個地下車庫,地下室,0是一樓(對於歐洲,而不是美國的建築!)和135層之上,使它比高聳的地獄高一層。

這可以安全地成爲一種新類型,因爲幾乎沒有將Floor變量與其他任何東西混淆的危險,並且幾乎不需要將Floor與任何其他數量進行數學組合。升降機需要去那裏,就是這樣。 在這種情況下,將Floor作爲新類型可以捕捉到一些錯誤,但增加的安全性是值得的,而不會產生痛苦。

使用類型或子類型作爲數組索引和循環邊界是一種很好的方式來使界外訪問變得不太可能。

Array(Floor) of ... 
for f in Floor loop ... 

如果你需要從一個整數變量分配給一個樓,一個類型轉換的信號編譯器和任何人閱讀代碼,這爲故意兩者。

subtype Population is Natural range 0 .. 10000; 

我們必須知道有多少人佔據建築物,用於安全,消防安全,加熱或冷卻要求以及其他目的。其範圍在兩端都有嚴格的限制:對於這座建築物,假設有超過10000名居住者被消防安全條例禁止。

基本類型是Natural(自身是Integer的子類型)而不是Integer,因爲總體不能小於零。

但是使人口成爲一種新類型可能會導致無盡的類型轉換問題。舉個例子,將它作爲子類型可以更容易地在熱負荷計算,提升調度策略,用水量預測等方面使用人口。

它是一個亞型,而不僅僅是整數仍提供保護的有益形式的事實;雖然整數可以分配給Population變量並在表達式中與它們混合,但任何嘗試分配超出範圍的值都將被標記爲錯誤。如果在編譯時無法檢測到它們,則會在運行時引發異常。試圖進入大樓的第10001人也是如此。

我會讓Java專家解釋在Java中實現這些策略的最佳方式。