簡體   English   中英

是否有可能在Java中運行時類型不匹配?

[英]Is it possible to have Runtime type mismatch in Java?

我正在閱讀OCaml和維基,它說:

*its static type system renders runtime type mismatches impossible*

我理解為什么,但我認為,為什么這在OCaml(和FP)中如此特別? 如何在Java中導致運行時類型不匹配? 例如

boolean a = true;
int b = a + 1;

將在編譯時返回錯誤。

編輯1:

哈斯克爾

func :: Int -> Bool
func i = if i > 0 then True else False

Java的

boolean func (int i) {
    if (i > 0) return true; else return false;
}

是不是這兩種情況都會在調用func時保證參數類型?

在Java中,您可能導致運行時類型不匹配,如下所示:

Object i = Integer.valueOf(6);
String s = (String) i;   
System.out.println(s);

這將編譯,因為允許將編譯時類型的iObject )強制轉換為String ,但是在運行時, i的實際值( 6 ,作為Integer )將與String不兼容。

鑒於此, ClassCastException

請考慮使用數組的以下代碼:

// create an array of strings
String[] strings = new String[10];

// cast it to an array of objects
Object[] objects = strings;

// insert an object into the array
objects[0] = new Object();     // Run-time error occurs here

Java允許這個編譯,盡管將一個字符串數組轉換為一個對象數組數組引入了運行時錯誤的可能性。 第8行演示了這一點,導致了專門為這種情況創建的類型的運行時異常: java.lang.ArrayStoreException: java.lang.Object

請參閱Java泛型並鍵入擦除

該wiki一般討論靜態類型系統,並將它們與動態類型語言進行對比,而不是與其他靜態類型語言進行對比。 OCaml或Haskell沒有特定的關於運行時類型不匹配的內容,這些不匹配並不適用於所有靜態類型的語言。

請注意, 不可能有點不誠實。 幾乎所有靜態類型的語言都能讓你以有限的方式進行運行時輸入,因為如果沒有它,某些任務就非常困難。 實際上,您引用的段落列出了一些這樣的情況,例如序列化。 這里的其他答案在Java中提供了一些很好的例子。 但是,絕大多數代碼應該能夠輕松避免運行時類型不匹配。

在Java中,類型不匹配是可能的。 例如,以下命令拋出ClassCastException

Object o = 1;
String s = (String) o;

但是,傳遞給方法的參數由編譯器檢查。

無法使用簽名調用方法

boolean func (int i) 

除非i是一個int ,並且不可能調用帶簽名的方法

boolean func2 (String s)

除非sStringnull

因此,在func2的主體內,您永遠不會在運行時獲得ClassCastException ,因為s不是String

在Java中,不可能在可再現類型 (基本類型,非泛型引用類型,原始類型,所有通配符參數化的類型或其元素類型可重新生成的數組類型)之間存在類型不匹配。

如果您有一個可重新類型的變量,那么它在任何時間點保存的值都保證是該類型的值。 對於引用類型,這意味着引用為null或指向運行時類為變量類型的子類型的對象。 這是有保證的,因為Java在存儲類型不是變量類型的子類型的值時需要強制轉換,並且對可再現類型進行強制轉換強制轉換類型,這意味着它們在運行時被檢查,如果類型不兼容,它將拋出一個例外,而不是讓類型不匹配。

另一方面,對於不可再生類型 (例如參數化類型),可能存在類型不匹配(在Java術語中稱為“堆污染”)。 這是因為對不可再生類型的強制轉換未經檢查的強制轉換

List<String> foo = new ArrayList<String>();
foo.add("hi");
List<?> bar = foo;
List<Integer> baz = (List<Integer>)bar; // unchecked cast
// now there is a type mismatch 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM