Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18

TRICKS: Ковариантность и её вкус

18.02.2014, 03:05. Показов 1353. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В java есть возможность расширять возвращаемый тип метода типом наследником,
что же можно из этого извлечь на практике:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.*;
 
/**
 * Created by mutagen on 18.02.14.
 */
public class Covariants {
 
    public static void main(String[] args) {
 
        BaseIface b1 = new BaseAbstract() {};
        System.out.println(b1.getMeSomeSet().getClass());
 
        BaseIface b2 = new BaseImp1();
        System.out.println(b2.getMeSomeSet().getClass());
 
        BaseIface b3 = new BaseImp2();
        System.out.println(b3.getMeSomeSet().getClass());
    }
 
    static interface BaseIface<T> {
        Set<T> getMeSomeSet();
    }
 
    abstract static class BaseAbstract<T> implements BaseIface {
        public Set<T> getMeSomeSet() {
            return new AbstractSet<T>() {
                List<T> lst = new ArrayList<>();
 
                @Override
                public Iterator<T> iterator() {
                    return lst.iterator();
                }
 
                @Override
                public int size() {
                    return lst.size();
                }
            };
        }
    }
 
    static class BaseImp1<T> extends BaseAbstract {
        @Override
        public TreeSet<T> getMeSomeSet() {
            return new TreeSet<>();
        }
    }
 
    static class BaseImp2<T> extends BaseAbstract {
        @Override
        public HashSet<T> getMeSomeSet() {
            return new HashSet<>();
        }
    }
}
как видно из реализации в каждом отдельном случае оверрида можно расширить тип и намотать на него какие либо свои плюшки и изменить тип возврата на этот тип с блекджеком и ..., это удобно в случае прямого использования имплементации нам не надо определять что там за тип вернётся его итак явно видно, но это не помешает нам использовать его через интерфейс или абстракт сужая его тип.
4
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2014, 03:05
Ответы с готовыми решениями:

TRICKS: Странная имплементация
Если вдруг вы хотите насолить работодателю, партнёрам по команде, тестировщикам... Имплементируйте интерфейсы таким адским способом :) ...

TRICKS: Что вернёт метод?
начинаем серию постов TRICKS по фишкам JVM и компилятора, вопросы для самообразования, не более :) просьба не компилировать, а...

ковариантность
ковариантность позволяет использовать override метод, чья ссылка на сам объект принадлежит базовому классу? помогите разобраться

12
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
18.02.2014, 05:17
Java
1
BaseIface b1 = new BaseAbstract()
а это как? учитывая что
Java
1
abstract static class BaseAbstract<T>
т. е. BaseAbstract мало того что статический так еще и абстрактный...
я как помню из Delphi/C++/C#
1) экземпляр статического класса создать нельзя
2) экземпляр абстрактного класса создать нельзя

если это компилиться значит в компиляторе JAVA что то не то
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
18.02.2014, 08:18
агерон, а чего вы не всю строчку скопировали, а только её часть? Вы опустили как раз самую важную часть.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
18.02.2014, 16:16
а причем тут все остальное? в других языках этого хватает чтобы сказать "это базовый абстрактный статический класс" что означает что экземпляры этого класса создавать нельзя
и наследование интерфейсов тут не играет ни какой роли, а если ваш компилятор позволяет позволяет такое скомпилировать значит это баг или фича вашего компилятора и не факт что переносимая отсюда вывод за такой код в продакшене отрубают руки ржавым тупым топором т. к. такой подход к написанию кода путь к трудно уловимым ошибкам, т. н. "плавающим" багам когда у вас из-за особеностей компилятора все работает нормально а у вашего колеги по проекту весь монитор в сообщениях об ошибках
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
18.02.2014, 16:25  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
а если ваш компилятор позволяет позволяет такое скомпилировать значит это баг или фича вашего компилятора
вы просто немного не разбираетесь в синтаксисе объявления анонимных безымянных классов, копиляторы хавают эту конструкцию, я уверен, любые )
0
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
18.02.2014, 16:28
Java
1
BaseIface b1 = new BaseAbstract() {};
{}
Как бы намекает, что создается объект анонимного класса, который расширяет BaseAbstract
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
18.02.2014, 16:30
mutagen, спорить не буду я не знаток Java, специализация C#, но по всем тем правилам ООП что я знаю это фича компилятора/языка а не парадигмы, парадигма ООП говорит только одно
1) экземпляры статических классов создать нельзя
2) абстрактный класс используеться только для наследования ,реализации общей функциональности, дерева классов, создать экземпляр абстрактного класса нельзя
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
18.02.2014, 16:33
Цитата Сообщение от агерон Посмотреть сообщение
абстрактный класс используеться только для наследования ,реализации общей функциональности, дерева классов, создать экземпляр абстрактного класса нельзя
Поэтому в примере создается не экземпляр абстрактного класса, а экземпляр класса-наследника.
Цитата Сообщение от агерон Посмотреть сообщение
экземпляры статических классов создать нельзя
Это не просто статический класс, а внутренний статический класс. Это большая разница.

Так что с парадигмами всё в порядке. Надо просто быть немного повнимательнее.
0
46 / 36 / 15
Регистрация: 05.02.2014
Сообщений: 140
18.02.2014, 16:33
Никто и не создавал экземпляр абстрактного класса.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
18.02.2014, 16:35  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
абстрактный класс
я не создавал абстрактный класс, на самом деле я его расширил (заэкстендил) анонимным и безымянным классом и уже создал его инстанс присвоив его по иерархии вверх абстракту, вы можете убедиться в этом сделав
Java
1
2
BaseIface b1 = new BaseAbstract() {};
System.out.println(b1.getClass());
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
18.02.2014, 16:40
RomanovD, анонимные классы зло, при чем трудно уловимое, и приводящая, к примеру, к веселым багам при сереализации/десереализации, или не коректному касту, если вы создали анонимный класс то будьте уж любезны перевести его из анонимного в нормальный, работы 2 минуты а читабельность и понимание кода повышается в разы, код надо писать для людей а не для компьютера, и использовать как можно меньше не задокументированных или мало известных фич, т. к. если вы уйдете с проекта тот кто будет поддерживать ваш проект очень долго и муторно будет пытаться понять как работает ваш код и как его не сломать при внесении новой функциональности

Добавлено через 3 минуты
и еще раз повторяю я не гуру Java, специализация другая, но данная фича Java является злом при переходе проекта от одного разработчика к другому, повторяю делайте простой код изначально он все равно потом станет сложным в местах взаимодействия с реальным миром
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
18.02.2014, 16:42  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
анонимные классы зло
это же TRICKS - тут не обсуждается как надо писать, это всяческие фишки языка которые могут привести к батхёрту в реальной жизни если в них недостаточно хорошо разбираться, ну и плюс к этому академически интересные фишки )
в первом посте серии TRICS я явно просил не считать эти фишки нормой, это так - своего рода разминка мозговых мышц
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
18.02.2014, 16:47
ну тогда сорри, разминка это хорошо, главное что бы в проектах сверх сложности не городили
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2014, 16:47
Помогаю со студенческими работами здесь

TRICKS: Срыв покровов - батлнек локинг
Надеюсь все вкурсе что в JVM некоторые боксированные объекты, а также строки кешируются, к примеру Integer до 127. Что же мы можем...

TRICKS: бесконечная рекурсия без StackOverflow
в JVM есть возможность создать практически бесконечную рекурсию не упав при этом в стек овер package tricks; /** * Created by...

TRICKS: Хотите в java функцию на 1 раз?
подход с анонимом вам поможет слепить метод который не саффектит пространство имён вашего класса :p import java.util.HashSet; import...

TRICKS: Что нам грядущая 8-чка готовит
допустим у нас есть List l = new ArrayList() { { for (int i = 0; i &lt; 10; i++) { ...

TRICKS: Даймонд шняга уже и в восьмёрке - встречаем
По новым веяниям в 8ке уже стало возможно делать имплементацию метода в интерфейсе пометив его ключевым словом default Что же нам это...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru