Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/64: Рейтинг темы: голосов - 64, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 10.02.2011
Сообщений: 3

По какому правилу осуществляется приведение типов в Java

10.02.2011, 21:18. Показов 13485. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Совсем уже запутался)) Знаю как это делать, но четко правило сформулировать не могу((( Подскажите pliz
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2011, 21:18
Ответы с готовыми решениями:

Каковы три случая, когда надо явно указывать приведение примитивных типов в Java?
Моя наставница по Java после проверки того, насколько хорошо я усвоил материал, сказала, что у меня проблемы с пониманием приведением...

Приведение типов сырых типов
class Gen<T> { T ob Gen(T o) { ob=o; } T getob(){ return ob; } public class RawDemo {

Не требуется приведение типов при умножении типов Byte
Читал тут книгу(Г. Шилдт, "Полный справочник по C#"), и нашел такое (ст. 77) Поскольку при умножении, например, 2 чисел типа byte,...

14
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
10.02.2011, 22:48
Это довольно обширный вопрос. Что конкретно вас интересует?
0
0 / 0 / 0
Регистрация: 10.02.2011
Сообщений: 3
10.02.2011, 23:45  [ТС]
Я так понимаю какого-то общего правила нет? Это вообщем вопросик в контроше. Может есть варианты как на него ответить?
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
11.02.2011, 00:38
Лучший ответ Сообщение было отмечено как решение

Решение

Начнем с того, что в Java абсолютно все типы производны от Object, простые типы вроде byte, int, double, etc. благодаря боксингу тоже унаследованы от Object(Byte, Integer, Double соответственно), т.е. все типы неявно приводятся к типу Object. Также вы можете приводить неявно к типу, который стоит выше по иерархии.
Т.е. в метод с сигнатурой
Java
1
void method(Object obj)
можно передать как Double так и какой-нибудь JRadioButton и ImagePanel(любой написанный вами класс).
Но есть такая вещь, как полиморфизм, т.е. есть какой-то класс от которого произведены другие классы. Для удобства возьмем тот же Object и производные Double и ImagePanel. В ваш метод пришел такой себе Object obj и вам надо его обработать. Вы можете определить его тип, предварительно зная возможные типы, для этого есть слово instanceof, которое применяется в следующем виде:
Java
1
2
3
4
5
6
7
void method(Object obj) {
   if(obj instanceof Double) {
      // выполняем некоторые действия если к нам пришел объект типа Double
   } else if (obj instanceof ImagePanel) {
      // выполняем некоторые действия если к нам пришел объект типа imagePanel
   }
}
Но для того, чтобы можно было воспользоваться методом нашего объекта зная его тип, но имея Object - мы должны выполнить приведение типов явным образом, т.е. так(в случае если в Object пришел Double):
Java
1
double d = ((Double)obj).doubleValue();
Есть также приведение простых типов, но с некоторой хитростью. Например, вы можете запросто без явного приведения типов выполнить такое присвоение:
Java
1
2
byte _byte = 128;
int _int = _byte;
А вот такое присвоение:
Java
1
2
int _int = 128;
byte _byte = _int;
вы уже не выполните, потому как вам надо будет привести типы, в противном случае jdk не даст скомпилировать вам код. Решить эту проблему можно только явным приведением типов, т.е.:
Java
1
2
int _int = 128;
byte _byte = (byte)_int;
Но и тут есть хитрость. Если значение содержащееся в переменной _int будет больше, чем тип к которому он приводится(byte) - то возьмется остаток от деления по модулю на максимальное значение этого типа (т.е. Byte.MAX_VALUE).
Т.е. говоря простыми словами - вы можете привести переменную меньшего размера(в байтовом понимании) к переменной большего размера без явного приведения типов, но обратное неверно, т.е. для приведения переменной большего размера к типу меньшего размера вам всегда надо использовать явное приведение типов, и не забывать про автоматическую обработку переполнений.

Есть еще один вид изменения типов - конвертация, т.е. для своей иерархии типов(не считая стандартных типов и Object) вы используете свой метод, в соответствии с которым вы приводите переменную типа, например, квадратная коробка в прямоугольную коробку, со своими законами преобразований и т.д. Конвертация также есть и для стандартных типов. Например привести число в строку и обратно:
Java
1
2
3
int _int = 350;
String _string = String.valueOf(_int);
int _int2 = Integer.parseInt(_string);
Важно понимать, что для простых типов(int, double, etc.) конвертация происходит через их классы(Integer, Double, etc.) при которой вызываются статические методы.


Ну вот как-то так, может что-то упустил или непонятно написал. Спрашивайте, если что не понятно

Добавлено через 4 минуты
Да, совсем забыл, в Java типом(но не инстансом) может выступать не только базовый класс, но и интерфейс реализуемый этими классами
12
0 / 0 / 0
Регистрация: 10.02.2011
Сообщений: 3
11.02.2011, 01:13  [ТС]
Уфф, огромный сенкс))) Будем думать...
0
0 / 0 / 0
Регистрация: 28.06.2012
Сообщений: 5
28.06.2012, 17:28
Подскажите, пожалуйста, по каким законам осуществляется приведение типа double к типу byte?
Из примера в книге Шилдта:
Java
1
2
3
4
5
6
7
8
9
10
// Демонстрирует приведения типов.
class Conversion {
 public static void main(String args[]) {
  byte b;
  double d = 323.142;
  System.out.println("\nПриведение double к byte.");
  b = (byte) d;
  System.out.println("d and b " + d + " " + b);
 }
}
Результат:
Приведение double к byte.
d and b 323.142 67


Как мы получили 67 из 323.142?
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
28.06.2012, 18:19
Kipchakbaev,
Java
1
b = (byte)((int)d % 256)
1
0 / 0 / 0
Регистрация: 28.06.2012
Сообщений: 5
28.06.2012, 18:52
Спасибо!
Но как это происходит математически?
Можно формулу?

Добавлено через 25 минут
Я понял.
Имеем double число 323,142;
отбрасываем дробную часть, получаем 323;
затем 323 - 256 = 67 типа byte

Странный результат, зачем такая операция нам может понадобиться?
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
28.06.2012, 19:44
Kipchakbaev, какая именно? Это банальное переполнение типа и ничего более
0
0 / 0 / 0
Регистрация: 28.06.2012
Сообщений: 5
29.06.2012, 10:20
Мне просто интересно, какое практическое применение чисел, обрезанных таким образом
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
29.06.2012, 13:53
Kipchakbaev, никакого(хотя в некоторых случаях достаточно полезная вещь), вы пытаетесь присвоить переменной значение, которое не помещается в ее размер. Для типа byte пределы значений [-128, 128), вы же присваиваете большее и получаете то, что поместилось в младшие 8 бит вашего начального значения. Смотрите, что происходит. Округляем ваше число до целого и получаем:
323 = 1 0100 0011, т.е. 9 бит, но в байт у нас помещается только 8 бит, поэтому оставляем только младшие 8 бит, которые помещаются, а старшие все отбрасываем и получаем свои 67 = 0 0100 0011
2
0 / 0 / 0
Регистрация: 28.06.2012
Сообщений: 5
29.06.2012, 14:21
Если смотреть на двоичные значения, то все становиться понятней. Спасибо!
0
8 / 4 / 1
Регистрация: 13.10.2011
Сообщений: 13
15.11.2012, 19:53
Друзья, а подскажите пожалуйста еще один момент по приведению типов при выполнении операций.
Я так понимаю, что при выполнении той или иной арифметической операции с целыми числами - они неявно приводятся к типу int, однако почему в данном примере:
Java
1
2
3
4
5
6
7
class InvalidDef{
    public static void main(String[] args){
    byte b1 = 50, b2 = -99;
    short k = b1 + b2;
    System.out.println("k=" + k);
    }
    }
Ругнется

InvDef.java:4: error: possible loss of precision
short k = b1 + b2;
^
required: short
found: int
1 error

Тут, следуя вышеприведенной логике, понятно, что ожидаем short, получаем int справа. Т.к. выполнена операция с 2мя целыми числами не важно какого типа, лишь бы не long, тогда результат операции был бы long. Здесь требуется явное приведение типов short k = (short) b1 + b2

Но, почему тогда:
Java
1
2
3
4
5
6
7
class InvalidDef{
    public static void main(String[] args){
    byte b1 = 50, b2 = -99;
    byte k = b1 + b2;
    System.out.println("k=" + k);
    }
    }
Операция выполнена успешно, хотя справа мы должны получить значение типа int, а слева byte.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
15.11.2012, 20:39
не знаю как у вас но у меня компилятор ругается на
Java
1
2
byte b1 = 100, b2 = 100;
byte b3 = b1 + b2;
javac "PrimitivesTricks.java" (в каталоге: /tmp)
PrimitivesTricks.java:10: possible loss of precision
found : int
required: byte
byte b3 = b1 + b2;
^
1 error
Сборка завершилась с ошибкой.
1
8 / 4 / 1
Регистрация: 13.10.2011
Сообщений: 13
15.11.2012, 23:39
Действительно, чето я попутал. Короче результат любой операции(включая побитовые и операции сдвига) над целыми числами ниже long - неявно приводятся к типу int.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2012, 23:39
Помогаю со студенческими работами здесь

Как осуществляется преобразование типов (для чего)?
Как осуществляется преобразование типов (для чего)? int *p=(int*)str; // ругается на p Спасибо :) P.s Си

Какому правилу следовать?
Доброго дня. Задача - плод фантазии; задача вряд ли совместима с реальностью. Но интересен верный подход к нахождению вероятности событий...

Приведение типов
Ребят, здравствуйте. Срочный вопрос. Заранее очень благодарен за помощь. У меня есть свой класс в c++ builder: class Hamal : public...

Приведение типов на Си
К примеру есть формула: A=(B/2.5)-1 Мне нужно чтобы число A было uint8_t либо uint16_t. Число B всегда int. какие только...

Приведение типов
Как компилятор заставить адекватней приводить типы? (VS2012) Например: int a=-1; unsigned int b=5; if(a>b){...}//Условие...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru