2016-11-16 29 views
-1

我讀A simple Box Class,我無意中發現這個代碼:的java:預計RuntimeError但不會發生

public class Box { 
    private Object object; 
    public void set(Object object) { this.object = object; } 
    public Object get() { return object; } 
} 

筆者在A simple Box Class提到,

有沒有辦法來驗證在編譯時,如何使用這個類。代碼的一部分可能會在整個框中放置一個Integer,並期望將Integer從中取出,而另一部分代碼可能會錯誤地傳遞一個String,導致運行時錯誤。

但是當我測試並運行此代碼:

public class checkBox { 

public static void main(String[] args){ 
    Box box = new Box(); 
    box.set(new Integer(3)); 
    System.out.println(box.get()); 
    box.set("test"); 
    System.out.println(box.get()); 
} 

它運行正常,沒有錯誤,這是我所期待的,因爲在Java中存在一個分配不同類型的變量沒有問題對象引用(也是多態性在這裏我猜)。

那麼作者對那個詞組意味着什麼?我錯過了什麼?

+1

如果您編寫'String s =(String)box.get()',但您之前設置了一個Integer,則風險是 – AxelH

+0

儘管代碼中還存在一個調用'println(Object)'的代碼, '調用println(字符串)'。它這樣做是因爲'get()'被聲明爲返回'Object'。這是可行的,因爲'println(Object)'也可以正確處理字符串。 –

回答

2

這個(不是Java 5和更高版本的泛型)類可以用來保存任何類型的對象。因此,人們可以很容易地寫:

box.set(new Integer(47)); 
String s = (String)box.get(); 

,這將導致在運行時ClassCastException(其最有可能由「運行時錯誤」的意思)。

我推薦讀一些關於Java中的「真正」泛型,這有助於在編譯時檢測這些類型的問題。類似「Box」類的類將具有類型參數,指示包含對象的類型。

編輯:在檢查鏈接的文章(是的,我應該做過之前)後,Box類就是爲什麼應該使用泛型的一個「壞例子」,而不是 Generic類的一個例子。

+0

嗯,這可能是一個Box來放任何你想要的(不好),並根據類型處理結果。有了泛型,你需要根據你想要的類型創建一個新的實例,在這裏你可以毫無困難地共享這個實例。這有**一些**的優勢;) – AxelH

相關問題