Как стать автором
Обновить

Узнаем параметр Generic-класса в Java

Время на прочтение 9 мин
Количество просмотров 105K
Java *
Если вы не очень часто программируете на Java, то этот топик скорее всего будет для вас бесполезен. Не читайте его :)

Недавно понадобилось решить следующую задачу: определить класс, которым параметризован generic-класс.

Если кто-то сталкивался с подобной задачей, то наверное также сразу попробовал написать что-то вроде этого:
public class AbstractEntityFactory<E extends Entity> {
  public Class getEntityClass() {
    return E.class;
  }
}

Увы, IDE либо компилятор сразу укажут вам на ошибку («cannot select from a type variable» в стандартном компиляторе): " E.class" — не является допустимой конструкцией. Дело в том, что в общем случае во время исполнения программы информации о реальных параметрах нашего generic-класса может уже и не быть. Поэтому такая конструкция в Java не может работать.
Читать дальше →
Всего голосов 40: ↑36 и ↓4 +32
Комментарии 32

Несколько событий в Delphi-блогосфере

Время на прочтение 1 мин
Количество просмотров 892
Delphi *
Несколько новостей связанных с миром Delphi.

DelphiFeeds.ru


Стараниями Александра Божко, в интернете появился агрегатор русскоязычных новостей о Delphi. Сайт сделан по аналогии с известным западным порталом DelphiFeeds.com. В данный момент там собираются анонсы постов с 25 русскоязычных Delphi-блогов.

Адрес: DelphiFeeds.ru

«Дженерики в Delphi 2009 для Win32» в виде PDF-ки


Перевод статьи «Дженерики в Delphi 2009 для Win32» доступен в PDF файле. За вёрстку спасибо Андрею Тишкину.

Скачать можно здесь, либо на домашней странице Sébastien Doeraene (поиск по фразе «PDF form»).

Сравнивая дженерики в C#, C++ и Delphi(Win32) (перевод)


Ну и, на сладкое, доступен перевод статьи Comparing C#, C++, and Delphi (Win32) Generics. Автор: Craig Stuntz.
Перевод выложен в TDelphi-блоге Алексея Тимохина: тынц.
Всего голосов 39: ↑21 и ↓18 +3
Комментарии 20

Расширение Java: алиасы

Время на прочтение 2 мин
Количество просмотров 6.8K
Java *
Выкладываю данный пост с целью получения обратной связи от хабра-сообщества Java-программистов. При наличии достаточного количества голосов «за» эту фичу можно будет отправить для рассмотрения в Sun.

Проблема



После длительной работы с Java 5 и Java 6 и небольшой аналитики я пришел к тому, что generic'и в Java имеют ряд ограничений, которые не дают реализовать решение красивым способом, и обходить их порой приходится очень нетривиально. Данное высказывание относится к разработке подсистем, которые активно используют generic'и (доходит до 3-4 generic-типов со сложной иерархией в описании класса).

Приведу примеры кода, которые явно указывают на данные ограничения, а также неудобство использования (рассматривать только синтаксис):
public class A {
    public <X> void method(List<? extends X> list) {
        // processElement(list, list.get(0)); - compilation error
        processElement((List) list, (Object) list.get(0)); // compilation warning
    }

    public <T> void processElement(List<T> list, T object) {
    }

    public static class B<T extends I1 & I2> {
    }

    // Приходится повторять объявления generic-типов
    public static class С<T extends I1 & I2> extends A.B<T> {
    }
}


Читать дальше →
Всего голосов 7: ↑2 и ↓5 -3
Комментарии 7

Крадущийся тигр, затаившийся дракон

Время на прочтение 8 мин
Количество просмотров 32K
Программирование *Java *.NET *C# *
Java vs. C#… Что может быть лучше вечного спора? Нет, данная статья не посвящена очередному бенчмарку, и даже не является holy war, не стоит даже вопрос: «кто круче».

Для каждой задачи существует свой инструмент. Сравнивать C# и Ruby, например, не имеет смысла, т.к. их целевое предназначение совершенно разное, да и природа также. Однако именно C# и Java являются наиболее близкими по своей философии.

Очень часто коллеги, пишущие на Java, даже не подозревают о многих (!!!) вещах, которые предоставляет (или, наоборот не предоставляет) C#.

Если Вам интересно посмотреть на C# и Java без субъективизма, а также узнать внутреннее устройство той или иной возможности, тогда вперед.
Читать дальше →
Всего голосов 200: ↑129 и ↓71 +58
Комментарии 194

Динамические Linq-запросы или приручаем деревья выражений

Время на прочтение 4 мин
Количество просмотров 22K
Программирование *Visual Studio *C# *

Введение


Linq to Entity позволяет очень выразительно со статической проверкой типов писать сложные запросы. Но иногда надо нужно сделать запросы чуть динамичнее. Например, добавить сортировку, когда имя колонки задано строкой.
Т.е. написать что то вроде:
var query = from customer in context.Customers
    select customer;
//ошибка! не компилируется.
query = query.OrderBy("name");
var data = query.ToList();

На помощь в этом случае придет динамическое построение деревьев выражений (expression trees). Правда одних выражений будет недостаточно, потребуется динамически находить и конструировать шаблонные методы. Но и это не так сложно. Подробности ниже.
Читать дальше →
Всего голосов 18: ↑14 и ↓4 +10
Комментарии 10

The art of Generics

Время на прочтение 5 мин
Количество просмотров 48K
Программирование *.NET *C# *
Универсальные шаблоны – они же generics, являются одним из мощнейших инструментов разработки.

CLR поддерживает их на уровне MSIL, и всего рантайма, что позволяет нам совершать некоторые трюки с типобезопасностью.

Если Вы знакомы с шаблонами C++, но хотели бы провернуть, если не вычисления на этапе компиляции, то по изяществу ничем не уступающие операции на C#, то эта статья поможет в этом.
Читать дальше →
Всего голосов 18: ↑16 и ↓2 +14
Комментарии 16

Использование generic wildcards для повышения удобства Java API

Время на прочтение 6 мин
Количество просмотров 139K
Программирование *Java *
Доброго времени суток!

Этот пост для тех, кто работает над очередным API на языке Java, либо пытается усовершенствовать уже существующий. Здесь будет дан простой совет, как с помощью конструкций ? extends T и ? super T можно значительно повысить удобство вашего интерфейса.
Читать дальше →
Всего голосов 39: ↑36 и ↓3 +33
Комментарии 7

Расширенный материал по Java 8

Время на прочтение 4 мин
Количество просмотров 51K
Блог компании GolovachCourses Java *
Не секрет, что многие Java-программисты, начиная свой путь в индустрии, уделяют большое внимание «тяжелым» технологиям — OpenJPA, Spring, JAX-RS, EJB, WS-*,… Это дает возможность как скорее влиться в современные корпоративные проекты, так и максимизировать скорость роста зарплаты.

Многие из них в конце концов «спускаются» до технологий лежащих в основе указанных фреймворков — JDBC, Servlet API, NIO/NIO.2. Однако прискорбно, что зачастую не остается время на детальное изучение самого языка и возможностей платформы.

Речь идет не о тонкостях или экзотике, а о том, что составляет существенную часть работы фреймворка: Servlet-контейнер использует множественные ClassLoader-ы, JPA2-провайдер использует манипулирование байткодом, абсолютное большинство библиотек используют Reflection API, всеобщее использование Generics только «усугубилось» с появлением функциональных интерфейсов (java.lang.function.*) и лямбд.

На недопонимание изначальной платформы (ClassLoader, Reflection API) накладываются «новвоведения» Java 5 (Generics), а теперь еще и Java 8 (методы в интерфейсах, ссылки на методы, лямбды, Stream API, JSR 308: Pluggable Type Systems). Надо обратить внимание на то, что Generics + Java 8 — это не просто языковые фичи, это частично переход к функциональному стилю программирования.

Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования udemy.com (аналог Coursera/EdX).

Я собрал определенное количество полезных (на мой взгляд) ссылок по следующим темам
  1. Методы в интерфейсах, ссылки на методы, множественное наследование
  2. Лямбды (Project Lambda)
  3. Stream API
  4. Функциональные алгоритмы
  5. Аннотации
  6. Генерики
  7. Reflection API
  8. Загрузка классов

Надеюсь кто-то сочтет их полезными.
Читать дальше →
Всего голосов 43: ↑34 и ↓9 +25
Комментарии 35

Эффективный JSON с функциональными концепциями и generics в Swift

Время на прочтение 14 мин
Количество просмотров 12K
Программирование *Разработка под iOS *Разработка мобильных приложений *Функциональное программирование *Swift *
Перевод
Это перевод статьи Tony DiPasquale «Efficient JSON in Swift with Functional Concepts».

Предисловие переводчика


Передо мной была поставлена задача: закачать данные в формате JSON с Flickr.com о 100 топ местах, в которых сделаны фотографии на данный момент, в массив моделей:
Читать дальше →
Всего голосов 13: ↑12 и ↓1 +11
Комментарии 4

Age of JIT compiling. Part II. CLR is watching you

Время на прочтение 9 мин
Количество просмотров 13K
Программирование *.NET *Компиляторы *C# *
Продолжая тему JIT-компиляции .NET'a, сегодня мы рассмотрим диспетчеризацию методов у интерфейсов, generics (как классов, так и отдельных методов вместе с реальными сигнатурами); производить отладку релизных сборок с оптимизациями; разберемся с истинным предназначением типа System.__Canon (это не то, что Вы подумали).
Читать дальше →
Всего голосов 27: ↑26 и ↓1 +25
Комментарии 11

The dangers of not looking ahead

Время на прочтение 3 мин
Количество просмотров 23K
Программирование *.NET *C# *
На первый взгляд, dynamic в C# — просто object с поддержкой машинерии компилятора. Но не совсем.

Ядром времени выполнения является DLR (Dynamic Language Runtime) — подсистема/фреймворк для поддержки динамических языков программирования. Существует реализация под собственно C#, который идет в поставке с .NET, и отдельная для Iron-языков.

Когда мы работаем с обобщениями (generics), то CLR имеет свои оптимизации на предмет специализации оных. В тот момент, когда CLR+DLR должны работать с generics вместе, поведение написанного кода может стать непредсказуемым.
Читать дальше →
Всего голосов 35: ↑33 и ↓2 +31
Комментарии 13

Generics в Kotlin vs. Generics в JAVA: cходства, различия, особенности

Время на прочтение 7 мин
Количество просмотров 47K
Блог компании red_mad_robot Java *Разработка мобильных приложений *Разработка под Android *Kotlin *
Туториал

Эта статья про Generics в Kotlin — особенности их использования, сходства и различия с Generics в Java.

В двух словах про Generics
Если коротко, то Generics — это способ сказать, что класс, интерфейс или метод будут работать не с каким-то конкретным типом, а просто с каким-то. С каким именно будет определено из контекста. Например:

public interface List<E> extends Collection<E> {
	//...
}

Заранее неизвестно, объекты какого класса будут содержаться в списке, но это определится при его использовании:

List<String> list = new ArrayList<>();

Теперь это не просто список, а список строк. Generics помогают обеспечить типобезопасность: в List можно попытаться положить любой объект, но в List<String> — только String или один из его потомков.

Я разделю рассказ про Generics на две части: собственно Generics и использование Wildcards. Пока речь не заходит про Wildcards, использование Generics в Kotlin мало чем отличается от Java.
Читать дальше →
Всего голосов 20: ↑18 и ↓2 +16
Комментарии 7

Применяем дженерики в RAD Studio Delphi. Создаем библиотеку сортировки списков однотипных объектов

Время на прочтение 6 мин
Количество просмотров 15K
Программирование *Delphi *
Сегодня будем создавать в RAD Studio Delphi библиотеку классов, реализующих сортировку списков однотипных объектов.

Цель задачи


Прикладной разработчик должен получить инструмент для создания дочерних классов, в которых можно:

  • оперировать с объектами списка;
  • применять различные правила сравнения объектов;
  • применять различные алгоритмы сортировки объектов.

На выходе должна получиться библиотека классов, которая позволяет:

  • прикладному разработчику сортировать любой из 100 объектов любым из 100 методов сортировки;
  • дорабатывать и поддерживать новые алгоритмы или новые типы объектов в течении одного дня силами одного специалиста.
Читать дальше →
Всего голосов 10: ↑9 и ↓1 +8
Комментарии 4

Знакомство с командой курсов стека Java на Hexlet

Время на прочтение 4 мин
Количество просмотров 11K
Блог компании Хекслет Программирование *Java *
Привет, Хабраюзер. Мы давно хотели стать немного ближе к тебе. И сегодня столь длительно зреющая идея рассказать тебе более подробно о том: «кто и какие курсы Java стека на Хекслет делает» — воплотилась! Как думаю — стало понятно: мы расскажем Вам о курсах над которыми мы трудились последние пол года, включая самый последний курс который вот-вот начали записывать: Java для Web сервисов.


Читать дальше →
Всего голосов 13: ↑11 и ↓2 +9
Комментарии 1

Простые шаги по сокращению кода после применения паттерна «стратегия» с помощью generic-классов

Время на прочтение 4 мин
Количество просмотров 6.6K
.NET *
Эта заметка содержит ряд хитростей, позволяющих сократить код, получившийся после применения паттерна «стратегия». Как нетрудно догадаться из названия, все они будут так или иначе связаны с использованием generic-типов.
Это вторая версия статьи. Первая (под названием Набор мелких улучшений работы с паттерном «стратегия» с помощью generic-классов) получилась не очень удачной, так как в ней в духе Ландау и Лифшица было опущено несколько промежуточных шагов, критически важных для понимания хода мысли. Объявляю отдельную благодарность INC_R, сумевшему-таки в комментариях донести до меня этот простой факт.
Читать дальше →
Всего голосов 9: ↑7 и ↓2 +5
Комментарии 43

Зачем использовать статические типы в JavaScript? (Пример статической типизации на Flow)

Время на прочтение 9 мин
Количество просмотров 34K
Семантика *JavaScript *Программирование *TypeScript *
Туториал
Перевод
Как разработчик JavaScript вы можете целый день программировать, но не встретить ни одного статического типа. Так зачем думать об их изучении?

Ну, на самом деле изучение типов — это не просто упражнение для развития мышления. Если вы вложите некоторое время в изучение статических типов, их преимуществ, недостатков и примеров использования, это может чрезвычайно улучшить ваши навыки программирования.

Заинтересованы? Тогда вам повезло — именно об этом наша серия статей.

Во-первых, определение


Проще всего понять статические типы — это противопоставить их динамическим. Язык со статическими типами называют языком со статической типизацией. С другой стороны, язык с динамическими типами называют языком с динамической типизацией.
Читать дальше →
Всего голосов 19: ↑18 и ↓1 +17
Комментарии 43

Swift Generics: cтили для UIView и не только #1

Время на прочтение 4 мин
Количество просмотров 9.8K
Разработка под iOS *Разработка мобильных приложений *Xcode *Swift *

Часть #2


Вступление


Идея для публикации возникла после прочтения перевода CSS для Swift: использование стилей для любых подклассов UIView. Подход достаточно интересный, но он оказался не очень гибким, т.к. не позволяет объединять стили разных типов. Подробнее можно прочитать в комментарии.


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


Декорации


Введем понятие декорации, которое будет олицетворять придание неких свойств объекту:


typealias Decoration<T> = (T) -> Void
Читать дальше →
Всего голосов 10: ↑7 и ↓3 +4
Комментарии 12

Тьюринг-полнота Generic типов Java

Время на прочтение 18 мин
Количество просмотров 15K
Ненормальное программирование *Java *Математика *

Периодически на хабре можно встретить статьи о том, какие невероятные вещи можно сделать на шаблонах C++: конечные автоматы, лямбда-исчисление, машина Тьюринга и многое другое.


Параметризованные типы в Java традиционно считаются лишь пародией на шаблоны C++ (несмотря на то, что их даже сравнивать как-то некорректно), и причины этого несложно понять. Тем не менее не всё так плохо, и компилятор Java можно заставить производить во время проверки типов любые вычисления, лишь бы хватило оперативной памяти. Конкретный способ это сделать был описан в ноябре 2016-го года в этой прекрасной публикации. Его я и хотел бы объяснить.


Для затравки приведу следующий код. Корректен ли он? Предлагаю скомпилировать и проверить, угадали ли вы результат.


class Sample {

    interface BadList<T> extends List<List<? super BadList<? super T>>> {}

    public static void main(String[] args) {
        BadList<? super String> badList = null;
        List<? super BadList<? super String>> list = badList;
    }
}

Узнать ответ

Компилятор выбросит java.lang.StackOverflowError независимо от размера стэка.


Разберёмся, почему компилятор ведёт себя именно так (я бы не назвал это багом), как понимание данных причин может быть полезно и причём тут машина Тьюринга.

Читать дальше →
Всего голосов 42: ↑42 и ↓0 +42
Комментарии 12

Как generic-и нас спасают от упаковки

Время на прочтение 2 мин
Количество просмотров 10K
C# *
Из песочницы

При заходе в метод мы часто выполняемым проверку на null. Кто-то выносит проверку в отдельный метод, что бы код выглядел чище, и получается что то-такое:


        public void ThrowIfNull(object obj)
        {
            if(obj == null)
            {
                throw new ArgumentNullException();
            }
        }

И что интересно при такой проверке, я массово вижу использование именно object атрибута, можно ведь воспользоватся generic-ом. Давайте попробуем заменить наш метод на generic и сравнить производительность.

Читать дальше →
Всего голосов 22: ↑16 и ↓6 +10
Комментарии 30

Дженерики и конвертеры в Nim

Время на прочтение 3 мин
Количество просмотров 5.3K
Программирование *
Из песочницы
Логотип языка Nim

Всем привет! В данной статье я постараюсь рассказать, что такое generic процедуры и converter’ы в Nim (и показать примеры их использования)

Что такое Nim? Nim – компилируемый (в C, C++, Objective C и JS) высокоуровневый язык программирования со сборщиком мусора, имеющий три основных цели (в порядке приоритета): производительность, выразительность, элегантность. Официальный сайт языка, репозиторий на GitHub.
Также в Nim достаточно развито метапрограммирование (дженерики, шаблоны, макросы).
Читать дальше →
Всего голосов 20: ↑19 и ↓1 +18
Комментарии 7