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

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

10.02.2011, 21:18. Показов 13512. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru