Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2015, 18:15   #1
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
Печаль Java 8 типизация

Заранее извиняюсь за ошибки.)) Нужна помошь, вопрос такой:

Gen raw = new Gen (new Double(98.6)); // Создаётся обьект класса Gen который содержит значение типа дабл.
double d = (Double)raw.getob(); // Не пойму эту строку - если я убераю кастинг к даблу то компилятор ругается и пишит что привести от Object к примитиву double не возможно. Зачем нужно преобразование к дабл если класс Gen содержит значение типа дабл? Если вызвать и распечатать
System.out.println(raw.getOb().getC lass()); // То получем class java.lang.Double.
Почему при стирании кастинга к даблу, компилятор пишит что getob(); возврашает Object ? Надеюсь вопрос был понятен..
Изображения
Тип файла: jpg Screenshot_2.jpg (38.7 Кб, 113 просмотров)
Тип файла: png Screenshot_4.png (22.0 Кб, 68 просмотров)
Maks88 вне форума Ответить с цитированием
Старый 29.12.2015, 01:27   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так надо было создавать Gen<Double>, а не просто Gen.

А Object потому что так реализованы generic'и в Java — на самом деле после компиляции не существует никаких Gen<T>, Gen<Double>, ... Везде будет просто Object вместо Т (гуглить erasure, ну и в учебнике наверняка есть дальше, скорее всего прям примерно на следующей странице)

И поэтому (и для обратной совместимости, например для стандартных классов коллекций) в отличии от какого-нибудь C# никто не запрещает создавать экземпляр generic класса без указания типа, просто тогда и компилятор будет сразу считать его как Object.

Например был ArrayList в Java 1.0. Потом появилась возможность использовать и ArrayList<T>, но старый вариант никуда не девался и старый код работающий с Object не сломался.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 29.12.2015 в 10:28.
Alex11223 вне форума Ответить с цитированием
Старый 15.01.2016, 21:56   #3
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию Стирание типов в джава

Вопрос следущий:

Код:
public class ApplTest {
 
    public static void main(String[] args) {
        
        Integer in = 50;
        Double in2 = 10.5;
        GenDemo<Integer,Double> appltest = new GenDemo<Integer,Double>();
        Object ln = appltest.integerNumbers(in,in2);
     System.out.println(ln.getClass()); // Вывод тип Integer. Почему не Object ? 
    }
Код:
public class GenDemo<T,V>{
    
    public   T integerNumbers  ( T a , V b){
            
        T res = a; 
        V res2 = b;
    
        System.out.println(res);
        System.out.println(res2);
        return res; 
// Идёт возврат типа T Integer но во время runtime java     
//игнорирует дженерики и по идее  должен вернутся тип Object ??  
    }
Maks88 вне форума Ответить с цитированием
Старый 15.01.2016, 22:35   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Потому же почему in2.getClass() вернет Double. Тут generic'и вроде не причем, просто метод объекта возвращает его класс.
От того что в рантайме нет информации о том что такое T, экземпляр же все равно не становится пустым Object'ом, а остается Integer'ом и обладает всеми его возможностями.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.01.2016, 08:34   #5
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Потому же почему in2.getClass() вернет Double. Тут generic'и вроде не причем, просто метод объекта возвращает его класс.
От того что в рантайме нет информации о том что такое T, экземпляр же все равно не становится пустым Object'ом, а остается Integer'ом и обладает всеми его возможностями.

Алекс у меня возвращает Integer от ln.getClass():
Код:
 
Object ln = appltest.integerNumbers(in,in2);
System.out.println(ln.getClass());
То что меня запутало это: я вызвал getClass через переменную типа Object и получил Integer. Насколько я понял я вызвал метод типа Object.
При самом вызове метода мне Eclipse писал что метод относитя к Object..
Так почему же Integer? " просто метод объекта возвращает его класс."
Maks88 вне форума Ответить с цитированием
Старый 16.01.2016, 08:35   #6
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Maks88 Посмотреть сообщение
Алекс у меня возвращает Integer от ln.getClass():
Код:
 
Object ln = appltest.integerNumbers(in,in2);
System.out.println(ln.getClass());
То что меня запутало это: я вызвал getClass через переменную типа Object и получил Integer. Насколько я понял я вызвал метод типа Object.
При самом вызове метода мне Eclipse писал что метод относитя к Object..
Так почему же Integer? " просто метод объекта возвращает его класс."
Метод Object должен вернуть его класс Object по логике сказанного вами..
Maks88 вне форума Ответить с цитированием
Старый 16.01.2016, 11:02   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну если создать класс Parent с методом getSomething возвращающим "hello1", и класс Child унаследованный от Parent и с переопределенным методом getSomething возвращающим "hello2", то при
Код:
Parent obj = new Child();
System.out.println(obj.getSomething());
оно вернет hello2. Это понятно?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.01.2016, 12:29   #8
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну если создать класс Parent с методом getSomething возвращающим "hello1", и класс Child унаследованный от Parent и с переопределенным методом getSomething возвращающим "hello2", то при
Код:
Parent obj = new Child();
System.out.println(obj.getSomething());
оно вернет hello2. Это понятно?
Да конешно тема полиморфизма понятна. Для этого нужно переопределить метод.
Maks88 вне форума Ответить с цитированием
Старый 16.01.2016, 12:44   #9
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну если создать класс Parent с методом getSomething возвращающим "hello1", и класс Child унаследованный от Parent и с переопределенным методом getSomething возвращающим "hello2", то при
Код:
Parent obj = new Child();
System.out.println(obj.getSomething());
оно вернет hello2. Это понятно?
Алекс. Вы хотите сказать что происходит неявное переопределение метода при вызове и поэтому выводится тип класса который наследуется от Object?
Maks88 вне форума Ответить с цитированием
Старый 16.01.2016, 13:20   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну getClass наверно как-то более хитро реализован внутри JVM чем просто переопределение, но смысл в том что он возвращает класс экземпляра, а не тип переменной в которой хранится ссылка на этот экземпляр.
В том месте куда ссылается ln все равно же лежит экземпляр Integer, а не Object.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 16.01.2016 в 13:22.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Типизация. Строки. Типы в типах. Человек_Борща Общие вопросы Delphi 4 04.10.2012 21:40
всеобщая ЧИПизация КАРТизация и ТИПизация всей страны grenles Свободное общение 10 01.03.2011 21:18
Помогите справиться с java.lang.OutOfMemoryError: Java heap space Levilaulada Помощь студентам 1 17.05.2009 10:59