Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java
Войти
Регистрация
Восстановить пароль
 
fadeinmad
9 / 9 / 2
Регистрация: 25.11.2012
Сообщений: 115
1

Магия Java или объясните, почему так

23.01.2017, 20:18. Просмотров 259. Ответов 2
Метки нет (Все метки)

Здравствуйте, в процессе разработки, подбирая различный способы обработки данных с приведением типов, наткнулся на одну занимательную ситуацию.
1 вопрос:
Кликните здесь для просмотра всего текста

Представьте, что есть код:
Java
1
2
3
4
5
6
7
8
9
10
11
public class SomeClass<T> { 
          public T getVal(Object o){ 
                    return (T)o; 
          } 
} 
 
public static void main(String[] args){ 
          String s = "Hello"; 
          Object o = s; 
          System.out.println((new SomeClass<Integer>()).getVal(o)); 
}
Кажется, что все понятно. При попытке привести объект к типу Integer программа вылетит с ClassCastException. Однако она не валится, а выводит в консоль "Hello".


Хотел задать еще один вопрос, но не получилось воспроизвести условия (удалил исходные данные). Была ситуация (тоже с использованием generic), когда код наподобие этого:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
public T someMethod(Object val, T defaultValue){
          try{
                    T myVar = (T)val;
                    return myVar;
          }
          catch(Exception ex){
                    return defaultValue;
          }
}

все-таки вылетал с ClassCastException. Но исключение не отлавливалось вышеуказанным блоком catch. Сначала проходил return, а потом программа вылетала с ClassCastException в классе Main. Сейчас при попытке воспоризвести эту ситуацию, я все равно получил "Hello" в консоль.

Я в Java джуниор, поэтому, предполагаю, что просто чего-то недопонимаю и буду благодарен за тактичное объяснение моей глупости =).
Я привык работать с generic'ами в C# и ожидал от них похожего поведения в Java, но здесь с ними творится что-то очень странное на мой взгляд. Это не все ситуации, с которыми я столкнулся, но эти наиболее красочно описывают мое недоумение.

Объясните, пожалуйста, поведение generic'ов в Java. Учебники и гугл не помогли =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2017, 20:18
Ответы с готовыми решениями:

Объясните чайнику что не так
class Untitled1 { public static void main(String args) { int k = 1; ...

Объясните как работает POST запрос в Java
Уважаемые форумчане, не могли бы вы написать простой POST запрос на java с...

Что не так Java ?
Пишу программу столкнулся с проблемой почему payer заполняется пустотой? ...

Не запускается java почему то
решил с джава поиграться, создал файл HelloWorld.java, скомпилировал его через...

Почему ejbSelect так долго работает?!?
Подскажите пожалуйста, почему у меня некоторые ejbSelect так долго выполняются...

2
ninjacut
149 / 149 / 51
Регистрация: 30.04.2016
Сообщений: 321
23.01.2017, 22:00 2
fadeinmad, В строчке 10 не происходит каст, метод принт берет Object и вызывает на нем .toString.
Если бы ты написал Integer x = o.getVal(o) - тогда был бы exception.
Типы в дженериках обрезаются в процессе компиляции, поэтому если достаются просто объекты проблем нет, они проявляются при приведении типов.
3
xoraxax
1376 / 1309 / 390
Регистрация: 05.07.2013
Сообщений: 6,310
Завершенные тесты: 2
23.01.2017, 22:12 3
https://docs.oracle.com/javase/tutorial/java/generics/genMethods.html
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2017, 22:12

Почему языки Java.next не коммерциализируются
Вопрос к тем, кто давно работает в отрасли. Сам пишу на Java два года, ввиду...

Почему в Java нет указателей?
перешел с плюсов на яву, и удивился узнав об отсутствии указателей, что же...

Почему не устанавливается eclips java
!SESSION 2018-01-24 21:59:50.512...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru