Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
9 / 9 / 2
Регистрация: 25.11.2012
Сообщений: 115

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

23.01.2017, 20:18. Показов 693. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2017, 20:18
Ответы с готовыми решениями:

Объясните почему так
#include &lt;iostream&gt; using namespace std; #define MAT(a,b) a/b; int main() { cout&lt;&lt;2*MAT(2+5,3); return 0; } В тестах...

Объясните почему так
Вообщем проблема такая: Когда у меня (по моей логике) персонаж должен стоять, он почему-то летит вверх проблема в 33, 34 строчках...

Объясните почему так
почему в ответе на эту программу выдает ответ &quot;не равно&quot;, надо сравнить именно число 0,1 и 0,1 и тип должен быть Double, препод дал задание...

2
 Аватар для ninjacut
155 / 154 / 53
Регистрация: 30.04.2016
Сообщений: 321
23.01.2017, 22:00
fadeinmad, В строчке 10 не происходит каст, метод принт берет Object и вызывает на нем .toString.
Если бы ты написал Integer x = o.getVal(o) - тогда был бы exception.
Типы в дженериках обрезаются в процессе компиляции, поэтому если достаются просто объекты проблем нет, они проявляются при приведении типов.
3
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
23.01.2017, 22:12
https://docs.oracle.com/javase... thods.html
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2017, 22:12
Помогаю со студенческими работами здесь

Объясните почему так
Когда я ввожу следующие числа: x = 2222222222 n = 3333333333 И x = 2222222221 (один знак поменяли) n = 3333333333 То...

Объясните почему так?
в этом коде using System; namespace ConsoleApplication1 { class Program { static void Main(string args) ...

Объясните, почему так происходит
Начал изучать AVR-ки и когда к кристаллу подсоединил ЛЕД матрицу столкнулся с проблемой. При заливки прошивки и последующих ресетах...

сериализация- объясните, почему так?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Объясните почему так происходит
Ответом к этому коду: int a, b, k; a = 10; b = 3; k = a &lt; b ? 1 : 2 ? 10, printf(&quot;xxxxxxx&quot;) : 20, printf(&quot;vvvvvv&quot;); ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru