2016-11-16 2 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 в поле и ожидать, что из него выйдут целые числа, а другая часть кода может ошибочно пройти в 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()', но вы ранее устанавливали в него целое число – AxelH

+0

Код работает, вызывая 'println (Object)' оба раза, даже если существует также 'Println (String)'. Он делает это, потому что 'get()' объявляется возвратом 'Object'. Это работает, потому что 'println (Object)' также корректно обрабатывает строки. –

ответ

2

Этот класс (не общий для Java 5 и более поздний) может использоваться для хранения любого типа объекта. Так можно было бы легко написать:

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

что привело бы к ClassCastException во время выполнения (который, скорее всего, подразумевается под «Runtime Error»).

Я рекомендую прочитать что-то о «реальных» дженериках в Java, что помогает в обнаружении таких проблем во время компиляции. Классы, подобные классу «Box», должны иметь Тип Параметр, указывающий тип содержащегося объекта.

Редактировать: После проверки связанной статьи (да, я должен был сделать это раньше), класс Box является именно «плохим примером» для того, почему следует использовать Generics, нет пример для класса Generic.

+0

Ну, это может быть коробка, чтобы поставить все, что вы хотите (не хорошо), и работать с результатом в зависимости от типа. С помощью дженериков вам нужно создать новый экземпляр, основанный на типе, который вы хотите, здесь вы можете поделиться этим экземпляром без особых трудностей. Это имеет ** некоторые преимущества **); – AxelH

Смежные вопросы