Kotlin | Обобщенные классы и функции
Последнее обновление: 31.05.2021
Generics или обобщения представляют технику, посредством которой методы и классы могут использовать объекты, типы которых на момент определения классов и функций неизвестны. Обобщения позволяют определять шаблоны, в которые можно подставлять различные типы.
Какие задачи решают обобщения? Допустим, у нас есть следующий класс
Обобщенные типы
Обобщенные типы (generic types) представляют типы, в которых типы объектов параметризированы. Что это значит? Рассмотрим следующий класс:
class Person<T>(val id: T, val name: String)
Класс Person использует параметр T. Параметры указываются после имени класса в угловых скобках. Данный параметр будет представлять некоторый тип данных, который на момент определения класса неизвестен.
В первичном конструкторе определяется свойство id
, которое представляет идентификатор. Оно представляет тип,
который передается через параметр T.
Само название параметра произвольное (если оно не совпадает с ключевыми словами). Но нередко используется T как сокращение от слова type.
При использовании типа Person необходимо его типизировать определенным типом, то есть указать, какой тип будет передаваться через параметр T:
fun main() { val tom: Person<Int> = Person(367, "Tom") val bob: Person<String> = Person("A65", "Bob") println("${tom.id} - ${tom.name}") println("${bob.id} - ${bob.name}") } class Person<T>(val id: T, val name: String)
Для типизации объекта после названия типа в угловых скобках указывается конкретный тип:
val tom: Person<Int>
В данном случае мы говорим, что параметр T фактически будет представлять тип Int. Поэтому в конструктор объекта Person для свойства id необходимо передать числовое значение Int:
Person(367, "Tom")
Второй объект типизируется типом String, поэтому в конструкторе для свойства id передается строка:
val bob: Person<String> = Person("A65", "Bob")
Если конструктор использует параметр T, то в принципе мы можем не указывать, каким типом типизируется объект — данный тип будет выводиться из типа параметра конструктора:
val tom = Person(367, "Tom") val bob = Person("A65", "Bob")
При этом параметры типа могут широко применяться внутри класса, не только при определении свойств, но и в функциях:
fun main() { val tom = Person("qwrtf2", "Tom") tom. checkId("qwrtf2") // The same tom.checkId("q34tt") // Different } class Person<T>(val id: T, val name: String){ fun checkId(_id: T){ if(id == _id){ println("The same") } else{ println("Different") } } }
Здесь класс Person определяет функцию checkId()
, которая проверяет, равен ли id значению параметра _id. При этом параметр _id имеет тип T — то
есть он будет представлять тот же тип, что и свойство id.
Стоит отметить, что generic-типы широко используются в Kotlin. Самый показательный пример, который представлен классом — Array<T>
. Параметр класса
определяет, элементы какого типа массив будет хранить:
val people: Array<String> = arrayOf("Tom", "Bob", "Sam") val numbers: Array<Int> = arrayOf(1, 2, 3, 4)
Применение нескольких параметров
Можно одновременно использовать несколько параметров:
fun main() { var word1: Word<String, String> = Word("one", "один") var word2: Word<String, Int> = Word("two", 2) println("${word1. source} - ${word1.target}") // one - один println("${word2.source} - ${word2.target}") // two - 2 } class Word<K, V>(val source: K, var target: V)
В данном случае класс Word
применяет два параметра — K и V. При создании объекта Word эти параметры могут представлять один и тот же тип, а могут представлять и
разные типы.
Обобщенные функции
Функции, как и классы, могут быть обобщенными.
fun main() { display("Hello Kotlin") display(1234) display(true) } fun <T> display(obj: T){ println(obj) }
Функция display()
параметризирована параметром T. Параметр также указывается в угловых скобках после слова fun и перед названием функции.
Функция принимает один параметр типа T и выводит его значение на консоль. И при использовании функции мы можем передавать в нее данные любых типов.
Другой более практический пример — определим функцию, которая будет возвращать наибольший массив:
fun main() { val arr1 = getBiggest(arrayOf(1,2,3,4), arrayOf(3, 4, 5, 6, 7, 7)) arr1. forEach { item -> print("$item ") } // 3 4 5 6 7 7 println() val arr2 = getBiggest(arrayOf("Tom", "Sam", "Bob"), arrayOf("Kate", "Alice")) arr2.forEach { item -> print("$item ") } // Tom Sam Bob } fun <T> getBiggest(args1: Array<T>, args2: Array<T>): Array<T>{ if(args1.size > args2.size) return args1 else return args2 }
Здесь функция getBiggest()
в качестве параметров принимает два массива. При этом мы точно не значем, объекты какого типа эти массивы будут содержать.
Однако оба массива типизированы параметром T, что гарантирует, что оба массива будут хранить объекты одного и того же типа. Внутри функции сравниваем размер массивов с
помощью их свойства size
и возвращаем наибольший массив.
НазадСодержаниеВперед
Что такое обобщенные функции на примерах, для чего они нужны
Обобщенные функции бывают в математике и программировании. Мы не будем разбирать, что такое обобщенные функции в математике, но обязательно разберем их определение в программировании.
Обобщенные функции являются важной частью парадигмы обобщенного программирования. Обобщенное программирование является ответвлением объектно-ориентированного программирования. Поэтому реализовать обобщенные функции можно лишь в тех языках, которые объектно ориентированы.
Что такое обобщенные функции?
Обобщенное программирование — это подход в программировании, при котором функции и алгоритмы применяются к разным типам данных, при этом они никак не видоизменяются. Важным инструментом обобщенного программирования являются обобщенные функции.
Впервые об обобщенных функциях заговорили еще в 70-х годах прошлого столетия. Тогда их применяли в языке ADA. Чуть позже возможность реализовывать такие функции перекочевала в другие объектно-ориентированные языки, такие как:
- С++;
- Python;
- Java;
- Паскаль;
- Eiffel;
- D;
- и др.
Многие языки, поддерживающие обобщенные функции, используются и в наше время.
Суть обобщенных функций сводится к тому, что они описывают требования не к каким-то конкретным типам данных, а к абстрактным сущностям. Классическим примером использования обобщенной функции в объектно-ориентированном программировании является рисование объектов. В этом случае реализуется одна концептуальная операция — «рисование объекта», которая может рисовать объекты разных форм:
- круги,
- треугольники,
- квадраты,
- и др.
То есть не нужно для каждой отдельной фигуры создавать отдельную функцию, так как создается одна функция «рисовать», которая реализуется с разными методами, определяющими форму рисуемого объекта. Таким образом мы получаем, что обобщенные функции определяют абстрактные операции, где известны название и параметры операции, но не известны способы ее реализации.
Обобщенные функции сами по себе ничего собой не представляют. То есть, если просто создать и определить обобщенную функцию в коде, то в конечном счете ничего не произойдет или возникнет ошибка. Для того чтобы реализовать обобщенную функцию, она должна принять основополагающие аргументы. В качестве аргументов могут выступать любые объекты или методы. К примеру, каждый отдельный метод может определять реализацию обобщенной функции для каких-то отдельных классов.
Вернемся к рисованию. Если у нас есть обобщенная функция «рисовать» и мы ее запустим, то ничего не произойдет, так как функция не будет понимать что рисовать. Для этого мы должны создать несколько методов для этой функции, например «треугольник», «квадрат», «круг» и др. и определять их в качестве аргументов обобщенной функции. Таким образом обобщенная функция должна выглядеть так: «рисовать треугольник», «рисовать круг», «рисовать квадрат» и др.
Или другой пример. Допустим в программе нужно что-то постоянно менять местами. Тогда мы создаем обобщенную функцию «менять местами» и несколько методов к ней.
Тогда при вызове функции в каком-то конкретном месте, мы указываем в ее аргументах, что конкретно нужно поменять местами. Например:
- «поменять местами числа»;
- «поменять местами буквы»;
- «поменять местами предложения»;
- «поменять местами строки»;
- и др.
В общем, любая функция, если она написана таким образом, что ее код может использоваться многократно с разными аргументами, может считаться обобщенной. В обобщенных функциях тело функции всегда остается одно и то же, но меняется лишь реализация функции.
Заключение
Обобщенные функции — основной инструмент обобщенного программирования. Обобщенное программирование несет в себе важную идею — научиться программировать таким образом, чтобы единожды написанный код можно было использовать многократно и максимально широко.
Обобщение Определение и значение | Dictionary.com
- Основные определения
- Викторина
- Связанный контент
- Примеры
- Британский
Показывает уровень сложности слова.
[ jen-er-uh-luh-zey-shuhn ]
/ ˌdʒɛn ər ə ləˈzeɪ ʃən /
Сохранить это слово!
См. синонимы для обобщения на Thesaurus.com
Показывает уровень обучения в зависимости от сложности слова.
сущ.
акт или процесс обобщения.
результат этого процесса; общее утверждение, идея или принцип.
Логика.
- суждение, утверждающее, что что-то истинно либо для всех членов определенного класса, либо для неопределенной части этого класса.
- процесс получения таких предложений.
Психология.
- Также называется генерализацией стимула. действие или процесс реакции на раздражитель, сходный с условным раздражителем, но отличный от него.
- Также называется обобщением ответа. действие или процесс создания другой, но сходной реакции на один и тот же стимул.
- Также называется опосредованной генерализацией. действие или процесс реакции на раздражитель, физически не похожий на условный раздражитель и ранее не встречавшийся в обусловливании.
- действие или процесс восприятия сходства или отношения между различными раздражителями, например, между словами, цветами, звуками, светом, концепциями или чувствами; формирование общего представления.
ТЕСТ
МОЖЕТЕ ЛИ ВЫ ОТВЕЧАТЬ НА ЭТИ ОБЫЧНЫЕ ГРАММАТИЧЕСКИЕ СПОРЫ?
Есть грамматические дебаты, которые никогда не умирают; и те, которые выделены в вопросах этой викторины, наверняка снова всех разозлят. Знаете ли вы, как отвечать на вопросы, которые вызывают самые ожесточенные споры по грамматике?
Вопрос 1 из 7
Какое предложение верно?
Происхождение обобщения
Впервые записано в 1755–1765 гг.; обобщать + -ация
СЛОВА, КОТОРЫЕ МОЖНО СПУТАТЬ С ОБОБЩЕНИЕМ
дедукция, экстраполяция, индукция, обобщение, гипотезаСлова рядом с обобщением
генеральный штаб, общий госпиталь, генералиссимус, универсал, обобщение, обобщение, обобщение, обобщенная координата, обобщенное другое, общее языкознание, вообще
Dictionary. com Полный текст На основе Random House Unabridged Dictionary, © Random House, Inc., 2023
Слова, относящиеся к обобщению
предложение, регулирование, правило, логика, рассуждение, смысл, сообразительность, анализ, аргумент, гипотеза, вывод, интерпретация, предпосылка, предложение, обоснование, мышление, абстракция, полуправда, закон, наблюдение
Как использовать обобщение в предложение
Это рискованное обобщение, но Стил и его коллеги указывают на некоторые другие намеки в литературе, чтобы предположить, что это может быть обычным явлением.
Данные о силовых тренировках один раз в неделю|Алекс Хатчинсон|2 февраля 2021 г.|Вне сети
Это предположение было основано на нескольких обобщениях относительно внутренней эволюции Солнечной системы.
Грохот на Марсе вселяет надежду на подземные потоки магмы|Робин Джордж Эндрюс|1 февраля 2021 г.|Журнал Quanta
Хотя человеческая природа и хорошая наука о данных — находить и определять закономерности в куче клиентских данных, слишком много категоризации приводит к широким обобщениям, которые могут упускать из виду важные модели поведения и точки зрения.
Поднимите свои кампании на более глубокий уровень, нарушив мир|Макс Браун|24 декабря 2020 г.|Search Engine Watch
Вероятно, есть много более впечатляющих примеров обобщения и творчества в остальном царстве животных, частью которого мы, конечно же, являемся.
Человек, Женщина, Мужчина, Камера, ТВ — Выпуск 93: Предтечи|Адитья Раджагопалан|2 декабря 2020|Наутилус Каждая частица природы с ручкой образует симплекс — обобщение треугольника.
Новая карта всех частиц и взаимодействий|Натали Волховер, Сэмюэл Веласко и Люси Рединг-Икканда|22 октября 2020 г.|Журнал Quanta
Glassdoor удобно делать обобщения о фирмах на основе выборки из 20 обзоров.
Если Cosi хочет получать прибыль, ей нужно повышать заработную плату|Дэниэл Гросс|22 августа 2013|DAILY BEAST
Это не просто психологическое обобщение, а своего рода экзистенциальная точка.
Почему фаворитизм добродетелен: дело против справедливости|Стивен Т. Асма|7 декабря 2012 г.|DAILY BEAST
После этого ко мне подошли несколько человек и заговорили со мной: «О, я с этим не согласен», «Я думал, что это обобщение». Женский комедийный роман|Триша Романо|4 апреля 2012 г.|DAILY BEAST
Откровенно говоря, ваше обобщение (одно из многих) о том, что ни один 15-летний подросток не способен писать так, как я, неверно.
Майкл Вольф — ребенок|Дэниел Джадт|22 июня 2010 г.|DAILY BEAST
«Мне так грустно, когда люди говорят, что печать мертва, потому что это такое несправедливое обобщение того, что происходит сейчас», — сказал он.
MTV’s Mr. Nice Guy|Энид Португес|26 апреля 2010|DAILY BEAST
Количество случаев в E. Mitior слишком ограничено, чтобы гарантировать дальнейшее обобщение.
Статистическое исследование природы и лечения эпилепсии|Alexander Hughes Bennett
Не следует придавать большого значения мельчайшим деталям и пренебрегать искусством обобщения.
Beacon Lights of History, Volume I|John Lord
Но именно этот парадокс ведет к реальному принципу обобщения свойств чисел.
Система логики: рациональная и индуктивная|Джон Стюарт Милль
Первая в нашем распределении была бы причислена к ошибкам обобщения, вторая — к ошибкам рассуждения.
Система логики: рациональная и индуктивная|Джон Стюарт Милль
Эмпирические законы, которые легче всего получить путем обобщения из истории, не сводятся к этому.
Система логики: ратиоцинативная и индуктивная | Джон Стюарт Милл
Определения британского словаря для обобщения
. общее приложениеакт или экземпляр обобщения
психол вызывание реакции, выученной на один стимул, другим, но сходным стимулом См. также кондиционирование
логика вывод общего утверждения из частного, формально путем добавления префикса квантификатора и замены предметного термина связанной переменной. Если квантор универсален (универсальное обобщение), то аргумент в целом недействителен; если оно экзистенциальное (экзистенциальное обобщение), то допустимо
логика любое утверждение, приписывающее свойство каждому члену класса (универсальное обобщение) или одному или нескольким членам (экзистенциальное обобщение)
Английский словарь Коллинза — полное и полное цифровое издание 2012 г. © William Collins Sons & Co. Ltd., 1979, 1986 © HarperCollins Издательство 1998, 2000, 2003, 2005, 2006, 2007, 2009, 2012
Что такое обобщение? — Деловые новости рынка
Обобщение относится к общим выводам из нескольких фактов или статистических данных. Например, предположим, что лондонец груб с кем-то, и впоследствии они считают, что все лондонцы грубы. Это обобщение.
Из очень ограниченных данных я сделал вывод, что это применимо ко всем случаям.
Глагол « обобщать ».
Люди, которые говорят, что что-то верно всегда, тогда как это лишь часть времени, обобщают. Они «жертвы» обобщений.
Это процесс идентификации части целого как целого. Человек может объединять части в группу, даже если между ними нет никакой связи.
Словарь Коллинза дает следующее определение термина:
«Обобщение — это утверждение, которое кажется верным в большинстве ситуаций или для большинства людей, но может быть не совсем верным во всех случаях».
Когда люди обобщают, они делают выводы, используя очень мало данных. Иногда их выводы ошибочны. Обобщение – индуктивное рассуждениеОбобщение является результатом индуктивного мыслительного процесса , т. е. частью индуктивного рассуждения . Индуктивное рассуждение контрастирует с дедуктивным умозаключением .
При индуктивном мышлении один или несколько опытов представляют целую категорию или класс событий.
С другой стороны, при дедуктивных рассуждениях вы начинаете с общей гипотезы или утверждения. Затем вы исследуете все возможности, чтобы прийти к логическому заключению.
Другими словами, при дедуктивном мышлении вы используете дедукцию для проверки теорий и гипотез.
Обобщение распространеноВ какой-то степени все мы жертвы обобщений. Иногда, однако, это полезно как механизм выживания.
Например, когда дети кладут руку в огонь, они чувствуют жгучую боль. Обобщение того, что все пожары вызывают жгучую боль, помогает людям выжить.
Однако в личных отношениях обобщение часто приводит к предвзятому и дискриминационному поведению.
Что может случиться, если «посторонний» придет в деревню и нападет на жителя? После нападения некоторые жители деревни могут подумать, что все посторонние опасны.
Таким образом, в будущем есть риск, что некоторые жители деревни будут либо избегать чужаков, либо нападать на них.
Расизм, ксенофобия и боязнь людей разных религий часто являются следствием обобщения.
Обобщения и политикиПредположим, что у власти находится партия консервативного толка, то есть та, которая верит в систему свободного рынка.