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

Обобщения в Java

25.07.2018, 19:27. Показов 1196. Ответов 12

Студворк — интернет-сервис помощи студентам
Доброго времени суток, вот изучаю обобщения и в моей голове что-то сломалось. Читаю на сайте Оракла следующее:

Кликните здесь для просмотра всего текста

Bounded Types
Oftentimes there are cases where we need to specify a generic type, but we want to control which types can be specified, rather than keeping the gate wide open. Bounded types can be used to restrict the bounds of the generic type by specifying the extends or the super keyword in the type parameter section to restrict the type by using an upper bound or lower bound, respectively. For instance, if you wish to restrict a type to a specific type or to a subtype of that specific type, use the following notation:

<T extends UpperBoundType>

Similarly, if you wish to restrict a type to a specific type or to a supertype of that specific type, use the following notation:

<T super LowerBoundType>


Пишу простые две строчки, но они работают наоборот:

Первый вариант работает, хоть и указано, что передаваемый тип данных коллекции должен быть суперклассом для ограничения, то есть тип, который является суперклассом для Number. А второй вариант не работает, хоть я и указал, что типы данных, которые могут быть переданы должны наследоваться от Number, а тип Double как раз и наследуется от Number. В чем я ошибаюсь, подскажите пожалуйста.

Java
1
2
3
4
   
// работает     
List<? super Number> gen = new ArrayList<>();
gen.add(3.14);
Java
1
2
3
4
    
// не работает   
List<? extends Number> gen = new ArrayList<>();
gen.add(3.14);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.07.2018, 19:27
Ответы с готовыми решениями:

Обобщения
Всем доброго времени суток! Никак не могу догадаться как работать с обобщенными методами: function Load&lt;T&gt;(path: string): T; ...

Обобщения
program Generics; uses SysUtils; type ///Предоставляет методы Print(), Println(). IGameObject = interface procedure...

Обобщения
Всем привет, есть строчка кода. Не понимаю, что значит &lt;? super T&gt; тут и зачем это нужно. Расскажите пожалуйста) public static &lt;T...

12
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.07.2018, 19:34
Цитата Сообщение от ЗеХель Посмотреть сообщение
<? super Number>
Можно прочитать как "нечто, у которого суперкласс - Number"
А здесь
Цитата Сообщение от ЗеХель Посмотреть сообщение
? extends Number
"Нечто, у которого наследник Number"
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
25.07.2018, 19:46  [ТС]
iSmokeJC, а разве не наоборот написано? Вот же прямо прямым текстом написано (С сайта оракла):

For instance, if you wish to restrict a type to a specific type or to a subtype of that specific type, use the following notation:
<T extends UpperBoundType>
- если вы хотите ограничить тип, определенным типом или его субклассами используйте эту нотацию.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
25.07.2018, 19:55
Тогда какой в этом смысл? Если ограничить тип тупо Number, то в него можно записать и инт без всяких выкрутасов. Так ведь?
Java
1
2
List<Number>list=new ArrayList<>();
        list.add(123);
Добавлено через 49 секунд
Это к слову про
Цитата Сообщение от ЗеХель Посмотреть сообщение
ограничить тип, определенным типом или его субклассами
Добавлено через 45 секунд
Цитата Сообщение от ЗеХель Посмотреть сообщение
Similarly, if you wish to restrict a type to a specific type or to a supertype of that specific type, use the following notation:
Вот это куда как прозрачней звучит
0
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
25.07.2018, 21:19
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Сообщение от ЗеХель
? extends Number
"Нечто, у которого наследник Number"
Родитель Number!
Java
1
List<? extends Number> list = new ArrayList<Integer>();
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
25.07.2018, 23:37  [ТС]
vcrop, так вот и я о том же, так почему наоборот в том, что я написал в шапке?
0
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
26.07.2018, 00:03
List<? extends Number> gen;
List параметрирован неизвестным классом, унаследованным от Number. Ты добавляешь Double. Но это может быть List<Integer>, List<BigDecimal> и т.д. Ты хочешь в List<Integer> видеть Double?
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
26.07.2018, 01:04  [ТС]
vcrop, так Double тоже наследуется от Number
0
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
26.07.2018, 12:38
да дело в том что ?extends Number не может гарантировать что ты там будешь содержать чисто Integer или чисто Double т.е. это нарушение идёт а дженерик у нас чтобы обеспечить типовую безопасность вот такое ? extends Number - используется для поисковых запросов чтобы мы возвращали лююбой тип который наследуется от Number
я тут маленько набрасал пример как этим пользоваться:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.List;
 
public class Test {
    public static void main(String[] args) {
        NumberTest<Integer> basa = new NumberTest<>();
        basa.add(12);
 
        ArrayList<Integer> i = (ArrayList<Integer>) basa.getData();
 
    }
 
    private static class NumberTest<E extends Number> {
        private final List<E> data;
 
        NumberTest() {
            data = new ArrayList<E>();
        }
 
        public void add(E e) {
            this.data.add(e);
        }
 
        public List<? extends Number> getData() {
            return data;
        }
    }
 
}
И ПОМНИ ТИПОВАЯ БЕЗОПАСНОСТЬ
1
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
26.07.2018, 12:44  [ТС]
WinniPuh, Спасибо за пример, я понял, но тогда почему это может гарантировать типовую безопасность? Потому что выше по иерархии наследования только Object?
Java
1
2
3
// работает     
List<? super Number> gen = new ArrayList<>();
gen.add(3.14);
0
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
26.07.2018, 14:07
<? super Number> это значит что ты можешь запихать туда любой объект родительского класса Number и объекты самого класса Number
Java
1
2
3
 List<? super Number> gen = new ArrayList<>();
        gen.add(11.2);
        gen.add(11);
в этом случае 11.2 или 11 являются не даблом конкретно а являются объектами Number
типо
Java
1
2
3
4
5
6
7
8
9
 
        Number i1 = new Integer(12);
        Number i2 = new Double(12.5);
 
        List<? super Number> gen = new ArrayList<>();
        gen.add(11.2);
        gen.add(11);
        gen.add(i1);
        gen.add(i2);
Добавлено через 7 минут
Цитата Сообщение от ЗеХель Посмотреть сообщение
Потому что выше по иерархии наследования только Object?
Тоже так думал, ты смог бы туда запихать любой объект сделав понижение типа любого объекта до класса Object, но это не удастья
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
 
        Number i1 = new Integer(12);
        Number i2 = new Double(12.5);
        Object o = i1;
        Object L = new Object();
        L = "Dfqc";
        List<? super Number> gen = new ArrayList<>();
        gen.add(11.2);
        gen.add(11);
        gen.add(i1);
        gen.add(i2);
        gen.add((Number) o); //здесь мы можем обжект повысить до нумбер, т.к. объект всётаки является числом
  gen.add((Number) L);  // а вот тут мы уже словим класс каст поинтер экцепшен т.к. объет не повысится до нумбер от является стрингом
Добавлено через 53 секунды

Не по теме:

я не вижу лайки вроде в этот раз не х ню.. сморозил:)



Добавлено через 45 минут
0
24 / 21 / 3
Регистрация: 04.11.2014
Сообщений: 283
26.07.2018, 14:58  [ТС]
Вообще я кажется разобрался, дело в принципе PECS (Producer extends and Consumer super), который и определяет в случае коллекций wildcard (а не просто параметр типа, как я думал) extend как только как коллекцию для чтения, а super - позволяет изменять коллекцию. Об этом статья есть на хабре неплохая
https://habr.com/post/207360/
2
 Аватар для vvm28
771 / 539 / 67
Регистрация: 22.12.2013
Сообщений: 2,498
Записей в блоге: 26
03.08.2018, 16:18
Можно привести к соответствующему типу оболочке, к Double, Integer ... и тд.
После этого добавить.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
package generics;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 *
 * @author vvm
 */
public class NumExt {
 
    public static void main(String[] args) {
 
        List<? extends Number> gen = new ArrayList<>();
 
        //gen.add(3.14);// не работает   
        double iNum = 3.14;
        ((List<Double>) gen).add(iNum);
        ((List<Integer>) gen).add((int) iNum);
 
        iNum = 0.1245454;
        ((List<Double>) gen).add((double) iNum);
 
        for (int i = 0; i < gen.size(); i++) {
            System.out.println("Value = " + gen.get(i) + " Type = " + gen.get(i).getClass().getName());
        }
 
    }
}
/*
run:
Value = 3.14 Type = java.lang.Double
Value = 3 Type = java.lang.Integer
Value = 0.1245454 Type = java.lang.Double
BUILD SUCCESSFUL (total time: 2 seconds)
 
*/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2018, 16:18
Помогаю со студенческими работами здесь

Обобщения
Доброго времени суток. Решил немного поковырять С# и застрял на обобщениях. К сути. Имеется класс с методом, добавляющим элемент в конец...

Обобщения и интерфейсы
Есть ли интернет справочник (!) по JAVA, где были бы описаны все пакеты, классы и их применение??? и еще вопросы: можете...

Обобщения в интерфейсах
Доброй ночи. Что-то не могу сообразить простенькую задачку, подскажите пожалуйста. Есть несколько типов классов Cloth,Car, Home. Они...

Обобщения коллекций
Возникла немного тупая проблема, как обобщать коллекции сложно это объяснить, попробую кодом, делал это как-то так ? extends...

Создание обобщения
Здравствуйте. Возник вопрос, допустим я объявляю такой метод private T PixelsCalc&lt;T&gt;() where T : HashSet&lt;Point&gt;,...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru