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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2016, 14:30   #11
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
Злость

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну getClass наверно как-то более хитро реализован внутри JVM чем просто переопределение, но смысл в том что он возвращает класс экземпляра, а не тип переменной в которой хранится ссылка на этот экземпляр.
В том месте куда ссылается ln все равно же лежит экземпляр 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;//Возврат такой переменной.
Непонятно и никак немогу понять этот процесс.. На что он может повлиять в программе при написании таковой ? При не расчёте на стирание типов ? Можете дать пример или ссылку на пример ?

Последний раз редактировалось Maks88; 16.01.2016 в 15:11.
Maks88 вне форума Ответить с цитированием
Старый 16.01.2016, 15:24   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

erasure дженериков не относится к этому вопросу.

erasure это о том что такой код
Код:
ArrayList<String> list = new ArrayList<>();
list.add("Hi");
String x = list.get(0);
превратится компилятором во что-то типа такого
Код:
ArrayList list = new ArrayList();
list.add("Hi");
String x = (String) list.get(0);
Это влияет например на то что нельзя в одном классе реализовать интерфейс IComparable<String> и IComparable<Integer>. Или создать экземпляр через new T() (один из вариант решения это передать Class полученный из MyClass.class и вызывать метод newInstance).

А тут можно забить на дженерики и думать про
Код:
Parent obj = new Child();
System.out.println(obj.getSomething());
и
Цитата:
В том месте куда ссылается ln все равно же лежит экземпляр Integer, а не Object.
пока не настанет просветление.

и в первом примере
Код:
        System.out.println(list.getClass()); // ArrayList
        System.out.println(list.get(0).getClass()); // String
потому что ArrayList<String> не существует в JVM, а вот String лежащий в нем вполне существует, просто его надо скастовать из Object к String для работы с ним.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 17.01.2016, 00:03   #13
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
erasure дженериков не относится к этому вопросу.

erasure это о том что такой код
Код:
ArrayList<String> list = new ArrayList<>();
list.add("Hi");
String x = list.get(0);
превратится компилятором во что-то типа такого
Код:
ArrayList list = new ArrayList();
list.add("Hi");
String x = (String) list.get(0);
Это влияет например на то что нельзя в одном классе реализовать интерфейс IComparable<String> и IComparable<Integer>. Или создать экземпляр через new T() (один из вариант решения это передать Class полученный из MyClass.class и вызывать метод newInstance).

А тут можно забить на дженерики и думать про
Код:
Parent obj = new Child();
System.out.println(obj.getSomething());
и

пока не настанет просветление.

и в первом примере
Код:
        System.out.println(list.getClass()); // ArrayList
        System.out.println(list.get(0).getClass()); // String
потому что ArrayList<String> не существует в JVM, а вот String лежащий в нем вполне существует, просто его надо скастовать из Object к String для работы с ним.
Алекс спосибо огромное! Всё понятно.
Maks88 вне форума Ответить с цитированием
Старый 17.01.2016, 00:19   #14
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
Хорошо

Цитата:
Сообщение от Maks88 Посмотреть сообщение
Алекс спосибо огромное! Всё понятно.
Хотел еше коечто спросить:

Код:
 public static <T> Foo<T> create(Object o1, Object o2) {
		 
		    Foo<T> result = new Foo<T>();
		    
		    result.value = (T) o1;
		    result.value2 = (T) o2;
		    return result;
		}
Непонятно сам синтаксис public static <T> Foo<T> create() - зачем перед типом возврата Foo ставится еше дженерик <T> тоисть на что это влияет в методе ? сам Foo дженерелизованный а до него что это за <T> ? Если можно пример с и без него чтобы понять на что он влияет.. буду благодарен.
Maks88 вне форума Ответить с цитированием
Старый 19.01.2016, 20:44   #15
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию

Код:
public class Hi {}
public class Lo extends Hi{}
 
public class Test {
        
                List<Hi> mylist = new ArrayList<>();
                                              
        List <? super Lo> list2 = mylist;
        list2.add(new Lo());
        list2.add(new Hi()); // Ошибка компиляции       
        Hi hi = list2.get(0); //Ошибка компиляции
        Lo lo = list2.get(0); //Ошибка компиляции
        Object o = list2.get(0);
}
                /* Буду рад если ктото сможет обьяснить почему происходит ошибка компиляции */
Maks88 вне форума Ответить с цитированием
Старый 19.01.2016, 21:00   #16
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Что в ошибке-то?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.01.2016, 22:09   #17
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Что в ошибке-то?
Код:
  
Hi hi = list2.get(0); //Ошибка компиляции 
Lo lo = list2.get(0); //Ошибка компиляции 
Type mismatch: cannot convert from capture#3-of ? super Lo to Hi

Код:
list2.add(new Hi()); // Ошибка компиляции 
The method add(capture#2-of ? super Lo) in the type List<capture#2-of ? super Lo> is not applicable for the arguments (Hi)
Maks88 вне форума Ответить с цитированием
Старый 19.01.2016, 22:30   #18
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

<? super Lo> значит что там Lo или Object, а не Lo или Hi (это extends)

Код:
Object obj = list2.get(0);
работает.

С Lo не работает потому что нет гарантии что там Lo.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.01.2016, 23:03   #19
Maks88
Пользователь
 
Регистрация: 28.12.2015
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
<? super Lo> значит что там Lo или Object, а не Lo или Hi (это extends)

Код:
Object obj = list2.get(0);
работает.

С Lo не работает потому что нет гарантии что там Lo.
Почему не засчитывает Hi ? Он же наследуется от него..


Тоисть компилятор не даёт вытащить что либо из массива
при таком раскладе, так как он не знает что там может быть но при помещении в массив обьектов он засчитывает Lo так как точно было указанно что это обьект типа Lo ? например здесь..
Код:
list2.add(new Lo());//Работает 
          list2.add(new Hi()); // Ошибка компиляции
Maks88 вне форума Ответить с цитированием
Старый 19.01.2016, 23:12   #20
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Почему не засчитывает Hi ? Он же наследуется от него..
Потому что это super, а не extends

Цитата:
<? super Lo> значит что там Lo или Object
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
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