{"id":288412,"date":"2018-08-23T14:55:03","date_gmt":"2018-08-23T10:55:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=288412"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=288412","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c Java-\u0444\u0440\u0435\u043d\u0434\u043b\u0438 Kotlin-\u043a\u043e\u0434"},"content":{"rendered":"\n<div data-io-article-url=\"https:\/\/habr.com\/company\/jugru\/blog\/417951\/\" class=\"post__text post__text-html js-mediator-article\">\u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e Kotlin \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u043d\u0435\u0441\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u043e\u0432\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439: \u044f\u0437\u044b\u043a \u0432\u0435\u0434\u044c Java-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 Java-\u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e, \u043d\u0435 \u0437\u0430\u0431\u0438\u0432\u0430\u044f \u043d\u0438\u0447\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u0443, \u0442\u0430\u043a? \u041d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435, \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0448\u043a\u0430\u0442\u0443\u043b\u043a\u0435 \u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0434\u043d\u043e, \u0430 \u0432 \u0442\u0440\u044e\u043c\u043e \u2014 \u043f\u043e\u0442\u0430\u0439\u043d\u0430\u044f \u0434\u0432\u0435\u0440\u0446\u0430. \u042f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u0445\u0438\u0442\u0440\u044b\u0445 \u043d\u044e\u0430\u043d\u0441\u043e\u0432.<\/p>\n<p>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0432\u0441\u0451 \u043f\u043b\u043e\u0445\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kotlin \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Java \u043d\u0435 \u043d\u0430\u0434\u043e\u00bb, \u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0437\u043d\u0430\u0442\u044c \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445 \u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0445. \u041d\u0430 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 <b>Mobius<\/b> \u0421\u0435\u0440\u0433\u0435\u0439 \u0420\u044f\u0431\u043e\u0432 <a href=\"https:\/\/mobiusconf.com\/2017\/msk\/talks\/jslrnocqzieusmswmg0w0\/\">\u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b<\/a>, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Kotlin \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0438\u0437 Java. \u0418 \u0434\u043e\u043a\u043b\u0430\u0434 \u0442\u0430\u043a \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0437\u0440\u0438\u0442\u0435\u043b\u044f\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0438\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c, \u043d\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043b\u044f \u0425\u0430\u0431\u0440\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/1L0q5VKx_-s?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u042f \u043f\u0438\u0448\u0443 \u043d\u0430 Kotlin \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0442\u0440\u0451\u0445 \u043b\u0435\u0442, \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043d\u0451\u043c, \u043d\u043e \u043f\u043e\u043d\u0430\u0447\u0430\u043b\u0443 \u043f\u0440\u0438\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043b Kotlin \u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 Java-\u043f\u0440\u043e\u0435\u043a\u0442\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043a\u0430\u043a \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435 Java \u0438 Kotlin\u00bb \u043d\u0430 \u043c\u043e\u0451\u043c \u043f\u0443\u0442\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e.<\/p>\n<p>  \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 Kotlin \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u0432\u043e\u0442 \u044d\u0442\u043e\u2026<\/p>\n<pre><code>compile 'rxbinding:x.y.x'\t\t compile 'rxbinding-appcompat-v7:x.y.x'  compile 'rxbinding-design:x.y.x'  compile 'autodispose:x.y.z' compile 'autodispose-android:x.y.z' compile 'autodispose-android-archcomponents:x.y.z'  <\/code><\/pre>\n<p>  \u2026 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e:<\/p>\n<pre><code>compile 'rxbinding:x.y.x' compile 'rxbinding-kotlin:x.y.x' compile 'rxbinding-appcompat-v7:x.y.x'  compile 'rxbinding-appcompat-v7-kotlin:x.y.x'  compile 'rxbinding-design:x.y.x' compile 'rxbinding-design-kotlin:x.y.x'  compile 'autodispose:x.y.z' compile 'autodispose-kotlin:x.y.z' compile 'autodispose-android:x.y.z' compile 'autodispose-android-kotlin:x.y.z' compile 'autodispose-android-archcomponents:x.y.z'  compile 'autodispose-android-archcomponents-kotlin:x.y.z' <\/code><\/pre>\n<p>  \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043f\u0430\u0440\u044b \u043b\u0435\u0442: \u0441\u0430\u043c\u044b\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0431\u0437\u0430\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u00ab\u043e\u0431\u0451\u0440\u0442\u043a\u0430\u043c\u0438\u00bb \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0438\u0437 Kotlin \u0431\u043e\u043b\u0435\u0435 \u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e. <\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0441\u0430\u043b\u0438 \u043d\u0430 Kotlin, \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0435 extension-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, inline-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043b\u044f\u043c\u0431\u0434\u0430-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u0437 Java 6. \u0418 \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e, \u044d\u0442\u043e \u043f\u0440\u0438\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0441 \u043a Kotlin, \u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441. \u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445, \u0441\u0430\u043c\u044b\u0445 \u0440\u0430\u0437\u0440\u0435\u043a\u043b\u0430\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0444\u0438\u0447 \u044f\u0437\u044b\u043a\u0430 \u2014 interoperability \u0441 Java. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0432\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0444\u0438\u0447\u0438, \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 Kotlin? \u041e\u043d\u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0441 Java, \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u0438 \u043e\u0431\u0451\u0440\u0442\u043a\u0438, \u0432\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b.<\/p>\n<p>  \u041d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u0440\u0430\u0434\u0443\u0436\u043d\u043e, \u043a\u0430\u043a \u0432 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u043f\u0435\u043a\u0442\u0430\u0445, \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u00ab\u043f\u0440\u0438\u043f\u0438\u0441\u043e\u0447\u043a\u0430 \u043c\u0435\u043b\u043a\u0438\u043c \u0448\u0440\u0438\u0444\u0442\u043e\u043c\u00bb, \u0435\u0441\u0442\u044c \u043e\u0441\u0442\u0440\u044b\u0435 \u0433\u0440\u0430\u043d\u0438 \u043d\u0430 \u0441\u0442\u044b\u043a\u0435 Kotlin \u0438 Java, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c.<\/p>\n<h2>\u041e\u0441\u0442\u0440\u044b\u0435 \u0433\u0440\u0430\u043d\u0438<\/h2>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u0443\u0440\u0441\u0435 \u043b\u0438 \u0432\u044b, \u0447\u0442\u043e \u0432 Kotlin \u043d\u0435\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445 \u0441\u043b\u043e\u0432 volatile, synchronized, strictfp, transient? \u041e\u043d\u0438 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u044b \u043e\u0434\u043d\u043e\u0438\u043c\u0451\u043d\u043d\u044b\u043c\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438\u0441\u044f \u0432 \u043f\u0430\u043a\u0435\u0442\u0435 kotlin.jvm. \u0422\u0430\u043a \u0432\u043e\u0442, \u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u0438 \u043f\u043e\u0439\u0434\u0451\u0442 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440\u0430.<\/p>\n<p>  \u0415\u0441\u0442\u044c <a href=\"https:\/\/github.com\/JakeWharton\/timber\">Timber<\/a> \u2014 \u0442\u0430\u043a\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043a\u0430-\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043d\u0430\u0434 \u043b\u043e\u0433\u0433\u0435\u0440\u0430\u043c\u0438 \u043e\u0442 \u043d\u0435\u0431\u0435\u0437\u044b\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e <abbr title=\"Jake Wharton\">\u0416\u0435\u043a\u0438 \u0412\u0430\u0440\u0442\u0430\u043d\u043e\u0432\u0430<\/abbr>. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0430\u043c \u0432 \u0432\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u0435\u0437\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0451, \u0430 \u0432\u0441\u0451, \u043a\u0443\u0434\u0430 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438 (\u0432 logcat, \u0438\u043b\u0438 \u043d\u0430 \u0432\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430, \u0438\u043b\u0438 \u0432 crash reporting, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435), \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0447\u0438\u043a\u0438. <\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u0438. \u0422\u043e\u0436\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. <\/p>\n<pre><code>object Analytics {     fun send(event: Event) {}     fun addPlugins(plugs: List&lt;Plugin&gt;) {}     fun getPlugins(): List&lt;Plugin&gt; {}  }  interface Plugin {     fun init()     fun send(event: Event)     fun close()  }  data class Event(     val name: String,     val context: Map&lt;String, Any&gt; = emptyMap()  ) <\/code><\/pre>\n<p>  \u0411\u0435\u0440\u0451\u043c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f, \u0443 \u043d\u0430\u0441 \u043e\u0434\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e Analytics. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0438\u0432\u0435\u043d\u0442\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d\u044b \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0442\u0430\u043c \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e. <\/p>\n<p>  Plugin \u2014 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 API. <\/p>\n<p>  \u0418, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u043b\u0430\u0441\u0441 Event, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043a\u043b\u044e\u0447 \u0438 \u043d\u0430\u0448\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c. \u0417\u0434\u0435\u0441\u044c \u0434\u043e\u043a\u043b\u0430\u0434 \u043d\u0435 \u043f\u0440\u043e \u0442\u043e, \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0445\u043e\u043b\u0438\u0432\u0430\u0440, \u0430 \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0434\u0435\u043b\u043e \u043f\u0440\u0438\u0447\u0435\u0441\u0430\u0442\u044c.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0435\u043c\u043d\u043e\u0436\u043a\u043e \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c\u0441\u044f. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 Kotlin:<\/p>\n<pre><code>private fun useAnalytics() {      Analytics.send(Event(\"only_name_event\"))      val props = mapOf(       USER_ID to 1235,       \"my_custom_attr\" to true     )      Analytics.send(Event(\"custom_event\", props))      val hasPlugins = Analytics.hasPlugins      Analytics.addPlugin(EMPTY_PLUGIN) \/\/ dry-run      Analytics.addPlugins(listOf(LoggerPlugin(\"ALog\"), SegmentPlugin)))      val plugins = Analytics.getPlugins()      \/\/ ...  } <\/code><\/pre>\n<p>  \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u043a\u0430\u043a \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f. \u041e\u0434\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430, \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0430-\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u043a\u0438. Event \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, event \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u043b\u0430\u0433\u0438\u043d\u044b, \u0437\u0430\u043f\u0438\u0445\u0438\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u00abdry run\u00bb-\u043f\u0440\u043e\u0433\u043e\u043d \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041b\u0438\u0431\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432, \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0438\u0445, \u043d\u0443 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u044e\u0437\u043a\u0435\u0439\u0441\u044b, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u0441\u0451 \u043f\u043e\u043a\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u043e.<\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 Java, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435:<\/p>\n<pre><code class=\"java\">private static void useAnalytics() {     Analytics.INSTANCE.send(new Event(\"only_name_event\", Collections.emptyMap()));      final Map&lt;String, Object&gt; props = new HashMap&lt;&gt;();     props.put(USER_ID, 1235);     props.put(\"my_custom_attr\", true);      Analytics.INSTANCE.send(new Event(\"custom_event\", props));      boolean hasPlugins = Analytics.INSTANCE.getHasPlugins();      Analytics.INSTANCE.addPlugin(Analytics.INSTANCE.getEMPTY_PLUGIN()); \/\/ dry-run      final List&lt;EmptyPlugin&gt; pluginsToSet = Arrays.asList(new LoggerPlugin(\"ALog\"), new SegmentPlugin());      \/\/ ...  } <\/code><\/pre>\n<p>  \u0412 \u0433\u043b\u0430\u0437\u0430 \u0441\u0440\u0430\u0437\u0443 \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u044b\u0440-\u0431\u043e\u0440 \u0441 INSTANCE, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0442\u044f\u043d\u0443\u0442 \u043d\u0430\u0432\u0435\u0440\u0445, \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044f\u0432\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438, \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0441\u043e \u0441\u0442\u0440\u0451\u043c\u043d\u044b\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0438 \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0437\u0434\u0435\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u0432\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435\u0435 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0444\u0430\u0439\u043b \u0441 Kotlin, \u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u043c\u0441\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0435\u0433\u043e \u043a\u0430\u043a-\u0442\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. <\/p>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 Event. \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 Colletions.emptyMap(), \u0438 \u0432\u044b\u043b\u0435\u0437\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u0421 \u0447\u0435\u043c \u0436\u0435 \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e?<\/p>\n<pre><code>data class Event(     val name: String,     val context: Map&lt;String, Any&gt; = emptyMap() ) <\/code><\/pre>\n<p>  \u041d\u0430\u0448 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438\u043c\u0435\u0435\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041c\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043c \u0438\u0437 Java \u0432 Kotlin, \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0432\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430: \u043e\u0434\u0438\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0438 \u043e\u0434\u0438\u043d \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0439, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e name. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u0430\u043a \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u043e\u043d \u0441\u0447\u0438\u0442\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043f\u0440\u0430\u0432\u044b.<\/p>\n<p>  \u041d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432\u0441\u0435\u0445 \u043f\u0435\u0440\u0438\u043f\u0435\u0442\u0438\u0439 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a Kotlin \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 JVM-\u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u2014 Kotlin Bytecode Viewer. \u0412 Android Studio \u0438 IntelliJ IDEA \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u0435\u043d\u044e Tools \u2014 Kotlin \u2014 Show Kotlin Bytecode. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0436\u0430\u0442\u044c Cmd+Shift+A \u0438 \u0432\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0441\u0442\u0440\u043e\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 Kotlin Bytecode. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/3d\/9i\/kg\/3d9ikgrehu0zgr50qyftivtoahi.png\"><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u043d\u0438 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u0442\u043e\u0433\u043e, \u0432\u043e \u0447\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0448 Kotlin-\u043a\u043b\u0430\u0441\u0441. \u042f \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u044e \u043e\u0442 \u0432\u0430\u0441 \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u043d\u0438\u044f \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430, \u0438, \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 IDE \u0442\u043e\u0436\u0435 \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u044e\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043a\u043d\u043e\u043f\u043e\u0447\u043a\u0443 Decompile.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0435\u0451 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 Java-\u043a\u043e\u0434:<\/p>\n<pre><code class=\"java\">public final class Event {     @NotNull     private final String name;     @NotNull     private final Map context;      @NotNull     public final String getName() { return this.name; }      @NotNull     public final Map getContext() { return this.context; }      public Event(@NotNull String name, @NotNull Map context) {       Intrinsics.checkParameterIsNotNull(name, \"name\");       Intrinsics.checkParameterIsNotNull(context, \"context\");       super();       this.name = name;       this.context = context;     }      \/\/ $FF: Synthetic method     public Event(String var1, Map var2, int var3, DefaultConstructorMarker var4) {       if ((var3 &amp; 2) != 0) {       var2 = MapsKt.emptyMap();       }      \/\/ ...  } <\/code><\/pre>\n<p>  \u0412\u0438\u0434\u0438\u043c \u043d\u0430\u0448\u0438 \u043f\u043e\u043b\u044f, \u0433\u0435\u0442\u0442\u0435\u0440\u044b, \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 name \u0438 context, \u0432\u0441\u0451 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u0410 \u043d\u0438\u0436\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432\u0442\u043e\u0440\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0438 \u0432\u043e\u0442 \u043e\u043d \u0441 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439: \u043d\u0435 \u0441 \u043e\u0434\u043d\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c, \u0430 \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0441 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f.<\/p>\n<p>  \u0422\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0443\u0442\u0438\u0442\u044c\u0441\u044f, \u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043b\u0435\u0437\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0433\u043b\u0443\u0431\u0436\u0435 \u0438 \u043f\u043e\u043a\u043e\u043f\u0430\u0442\u044c\u0441\u044f. \u041d\u0430\u0447\u0430\u0432 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u043c\u044b \u043f\u043e\u0439\u043c\u0451\u043c, \u0447\u0442\u043e DefaultConstructorMarker \u2014 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Kotlin, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u044e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439 \u0441 \u043d\u0430\u043c\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430\u043c\u0438, \u0442. \u043a. \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0442\u0438\u043f\u0430 DefaultConstructorMarker. \u0410 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u0432\u0441\u0435\u0433\u043e int var3 \u2014 \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u0438\u0435 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0431\u0438\u0442\u043e\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0434\u0432\u043e\u0439\u043a\u043e\u0439, \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e var2 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d, \u043d\u0430\u0448\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u044b, \u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u041a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e? \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0447\u0443\u0434\u043e-\u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f @JvmOverloads \u0438\u0437 \u0442\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b. \u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0432\u0435\u0441\u0438\u0442\u044c \u0435\u0451 \u043d\u0430 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<\/p>\n<pre><code>data class Event @JvmOverloads constructor(     val name: String,     val context: Map&lt;String, Any&gt; = emptyMap() ) <\/code><\/pre>\n<p>  \u0418 \u0447\u0442\u043e \u043e\u043d\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u0442? \u041e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0443. \u0422\u0435\u043f\u0435\u0440\u044c \u0442\u0430\u043c \u0432\u0438\u0434\u0438\u043c \u0438 \u043d\u0430\u0448 \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441 DefaultConstructorMarker, \u0438, \u043e \u0447\u0443\u0434\u043e, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441 \u043e\u0434\u043d\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0437 Java:<\/p>\n<pre><code class=\"java\">@JvmOverloads public Event(@NotNull String name) {     this.name, (Map)null, 2, (DefaultConstructorMarker)null); } <\/code><\/pre>\n<p>  \u0418, \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u043e\u043d \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0432 \u0442\u043e\u0442 \u043d\u0430\u0448 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441 \u0431\u0438\u0442\u043e\u0432\u044b\u043c\u0438 \u043c\u0430\u0441\u043a\u0430\u043c\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043d\u0435 \u043f\u043b\u043e\u0434\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0437\u0430 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u0442\u0443\u0434\u0430, \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0451 \u0432 \u043e\u0434\u0438\u043d \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0421\u043b\u0430\u0432\u043d\u043e. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b Java: \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0440\u0430\u0434 \u0438 \u043d\u0435 \u0432\u043e\u0437\u043c\u0443\u0449\u0430\u0435\u0442\u0441\u044f. <\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. \u041d\u0430\u043c \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0442 INSTANCE, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 IDEA \u043c\u043e\u0437\u043e\u043b\u0438\u0442 \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u043c \u0446\u0432\u0435\u0442\u043e\u043c. \u041d\u0435 \u043b\u044e\u0431\u043b\u044e \u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \ud83d\ude42<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ys\/rq\/er\/ysrqerlelunfipzn0xat3yek9da.png\"><\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0437\u0430 \u0441\u0447\u0451\u0442 \u0447\u0435\u0433\u043e \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f. \u0421\u043d\u043e\u0432\u0430 \u0433\u043b\u044f\u043d\u0435\u043c \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434.<\/p>\n<p>  \u0412\u044b\u0434\u0435\u043b\u0438\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0443\u043d\u043a\u0446\u0438\u044e init \u0438 \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e init \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ek\/5h\/m2\/ek5hm21brrzzf5yfu5mahq4x5eq.png\"><\/p>\n<p>  \u0422\u043e \u0435\u0441\u0442\u044c, \u043a\u0430\u043a \u043d\u0438 \u043a\u0440\u0443\u0442\u0438, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0443 \u043d\u0435\u0433\u043e \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b. \u041d\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0444\u043e\u0440\u0441\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0447\u0443\u0434\u0435\u0441\u043d\u0430\u044f \u0430\u043d\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f @JvmStatic. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0451 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c init \u0438 send \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0443\u043c\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0441\u0447\u0451\u0442.<\/p>\n<p>  \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043a public final init() \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e static, \u0438 \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u0435\u0431\u044f \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 INSTANCE. \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0432 Java-\u043a\u043e\u0434\u0435.<\/p>\n<p>  \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u043c, \u0447\u0442\u043e \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 INSTANCE. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u044c: \u043d\u0430\u0436\u0430\u0442\u044c Alt+Enter, \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u00abCleanup Code\u00bb, \u0438 \u0432\u0443\u0430\u043b\u044f, INSTANCE \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442, \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0432 Kotlin:<\/p>\n<pre><code class=\"java\">    Analytics.send(new Event(\"only_name_event\")); <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043d\u0430\u043c \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/0o\/m4\/ky\/0om4kydc_nj_fnmjd6jnfsfqfao.png\"><\/p>\n<p>  \u0418 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439: \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0443 \u043d\u0430\u0441 \u2014 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u043c\u0435\u0442\u043e\u0434\u044b instance, \u0442\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u044f\u043c\u0438 \u043d\u0435 \u0432\u0441\u0451 \u0442\u0430\u043a \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e. \u0421\u0430\u043c\u0438 \u043f\u043e\u043b\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, plugins) \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435. \u0410 \u0432\u043e\u0442 \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0430\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0435\u0439 \u0432\u0430\u043c \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0444\u043e\u0440\u0441\u0438\u0442\u044c \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0438 \u0433\u0435\u0442\u0442\u0435\u0440\u044b, \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0438\u0434\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e isInited, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e @JvmStatic, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0432 Kotlin Bytecode Viewer, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 isInited() \u0441\u0442\u0430\u043b \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c, \u0432\u0441\u0451 \u043e\u0442\u043b\u0438\u0447\u043d\u043e.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0439\u0434\u0435\u043c \u0432 Java-\u043a\u043e\u0434, \u00ab\u0437\u0430-clean-up-\u0438\u043c\u00bb \u0435\u0433\u043e, \u0438 \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0432 Kotlin, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u0447\u0435\u043a \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439 \u0438 \u0441\u043b\u043e\u0432\u0430 new \u2014 \u043d\u0443, \u043e\u0442 \u043d\u0438\u0445 \u0432\u044b \u043d\u0435 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u0435\u0441\u044c. <\/p>\n<pre><code class=\"java\">public static void useAnalytics() {      Analytics.send(new Event(\"only_name_event\"));      final Map&lt;String, Object&gt; props = new HashMap&lt;&gt;();     props.put(USER_ID, 1235);     props.put(\"my_custom_attr\", true);      Analytics.send(new Event(\"custom_event\", props));      boolean hasPlugins = Analytics.getHasPlugins();      Analytics.addPlugin(Analytics.INSTANCE.getEMPTY_PLUGIN()); \/\/ dry-run      \/\/ ...  } <\/code><\/pre>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433: \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u044d\u0442\u043e\u0442 \u0441\u0442\u0440\u0451\u043c\u043d\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u0439 \u0433\u0435\u0442\u0442\u0435\u0440 getHasPlugins \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430\u043c\u0438 \u0441\u0440\u0430\u0437\u0443. \u042f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u043d\u0430\u0442\u043e\u043a \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u043d\u043e \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0437\u0434\u0435\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u043e\u0441\u044c. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442?<\/p>\n<p>  \u041a\u0430\u043a \u0437\u043d\u0430\u044e\u0442 \u043f\u043b\u043e\u0442\u043d\u043e \u043e\u0431\u0449\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0441 Kotlin, \u0434\u043b\u044f \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0435\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0438 \u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c JavaBeans. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0433\u0435\u0442\u0442\u0435\u0440\u044b \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430\u043c\u0438 get, \u0441\u0435\u0442\u0442\u0435\u0440\u044b \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430\u043c\u0438 set. \u041d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435: \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0431\u0443\u043b\u0435\u0432\u043e \u043f\u043e\u043b\u0435 \u0438 \u0432 \u0435\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 is, \u0442\u043e \u0438 \u0433\u0435\u0442\u0442\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c is. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f isInited.<\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u043b\u0435\u0432\u044b \u043f\u043e\u043b\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 is. isPlugins \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u043b\u043e \u0431\u044b \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u0435\u043c. \u041a\u0430\u043a \u0436\u0435 \u043d\u0430\u043c \u0431\u044b\u0442\u044c? <\/p>\n<p>  \u0410 \u0431\u044b\u0442\u044c \u043d\u0430\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f (\u043a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0431\u0443\u0434\u0443 \u0447\u0430\u0441\u0442\u043e \u044d\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c). \u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f @JvmName \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0438\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c (\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0435 Java). \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0451:<\/p>\n<pre><code>@JvmStatic val hasPlugins     @JvmName(\"hasPlugin\") get() = plugins.isNotEmpty() <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0432 Java: \u043c\u0435\u0442\u043e\u0434\u0430 getHasPlugins \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442, \u0430 \u0432\u043e\u0442 hasPlugins \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0435\u0441\u0442\u044c. \u042d\u0442\u043e \u0440\u0435\u0448\u0438\u043b\u043e \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443, \u043e\u043f\u044f\u0442\u044c-\u0442\u0430\u043a\u0438, \u043e\u0434\u043d\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0451 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u043e\u0440\u0435\u0448\u0430\u0435\u043c!<\/p>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0430\u0432\u0435\u0441\u0438\u043b\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0433\u0435\u0442\u0442\u0435\u0440. \u0421 \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e? \u0421 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0434 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0451\u0439 \u043b\u0435\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e, \u0438 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a \u0447\u0435\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f @JvmName. \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u043d\u0430 \u0441\u0430\u043c val hasPlugins, \u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043f\u043e\u0439\u043c\u0451\u0442, \u043a \u0447\u0435\u043c\u0443 \u0435\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c. <\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u0432 Kotlin \u0435\u0441\u0442\u044c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u044f\u043c\u043e \u0432 \u043d\u0435\u0439. \u041c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0446\u0435\u043b\u044c\u044e \u0433\u0435\u0442\u0442\u0435\u0440, \u0444\u0430\u0439\u043b \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0434\u0435\u043b\u0435\u0433\u0430\u0442, \u043f\u043e\u043b\u0435, \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438, receiver extension-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0441\u0435\u0442\u0442\u0435\u0440 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0441\u0435\u0442\u0442\u0435\u0440\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0433\u0435\u0442\u0442\u0435\u0440. \u0418 \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a, \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442, \u043a\u0430\u043a \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u043b\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u043d\u0430 get:<\/p>\n<pre><code>@get:JvmName(\"hasPlugins\") @JvmStatic val hasPlugins     get() = plugins.isNotEmpty() <\/code><\/pre>\n<p>  \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0433\u0435\u0442\u0442\u0435\u0440\u0430, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0432\u0435\u0441\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0432\u0430\u0448\u0443 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438, \u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u041eK.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0441 \u0441\u043c\u0443\u0449\u0430\u0435\u0442 \u2014 \u044d\u0442\u043e \u00abAnalytics.INSTANCE.getEMPTY_PLUGIN()\u00bb. \u0422\u0443\u0442 \u0434\u0435\u043b\u043e \u0443\u0436\u0435 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e: \u041f\u041e\u0427\u0415\u041c\u0423? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043d\u043e \u0441\u043f\u0435\u0440\u0432\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043f\u043e\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0443\u0442\u0438. \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0432\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0439 \u0442\u0438\u043f \u043b\u0438\u0431\u043e \u043a\u0430\u043a String, \u0438 \u0435\u0449\u0451 \u043e\u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e const, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u0432-\u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e. \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u2014 private final static \u2014 \u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0435\u043d\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f Java-\u0448\u0442\u0443\u043a\u0430. <\/p>\n<p>  \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043b\u0438\u0447\u0435\u043d \u043e\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u0442\u043e \u0443 \u0432\u0430\u0441 \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u043e const. \u0412\u043e\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c val EMPTY_PLUGIN = EmptyPlugin(), \u043f\u043e \u043d\u0435\u043c\u0443, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0442\u043e\u0442 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0439 \u0433\u0435\u0442\u0442\u0435\u0440. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 @JvmName \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c, \u0443\u0431\u0440\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 get, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u044d\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u2014 \u0441\u043e \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438. \u0417\u043d\u0430\u0447\u0438\u0442, \u0441\u0442\u0430\u0440\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0443\u0442, \u0438\u0449\u0435\u043c \u043d\u043e\u0432\u044b\u0435. <\/p>\n<p>  \u0418 \u0442\u0443\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f @JvmField, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442: \u00ab\u041d\u0435 \u0445\u043e\u0447\u0443 \u0437\u0434\u0435\u0441\u044c \u0433\u0435\u0442\u0442\u0435\u0440\u043e\u0432, \u043d\u0435 \u0445\u043e\u0447\u0443 \u0441\u0435\u0442\u0442\u0435\u0440\u043e\u0432, \u0441\u0434\u0435\u043b\u0430\u0439 \u043c\u043d\u0435 \u043f\u043e\u043b\u0435\u00bb. \u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0451 \u043f\u0435\u0440\u0435\u0434 val EMPTY_PLUGIN \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0451 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0430\u043a.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/7e\/ei\/0i\/7eei0iwsgrd3pvkg_6lljoylhzm.png\"><\/p>\n<p>  Kotlin Bytecode Viewer \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0442\u043e\u0442 \u043a\u0443\u0441\u043e\u043a, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0442\u043e\u0438\u0442\u0435 \u0432 \u0444\u0430\u0439\u043b\u0435. \u041c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0442\u043e\u0438\u043c \u043d\u0430 EMPTY_PLUGIN, \u0438 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0433\u0435\u0442\u0442\u0435\u0440\u0430-\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0438\u0434\u0451\u0442. \u0410 \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044c decompile, \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u00abpublic static final EmptyPlugin EMPTY_PLUGIN\u00bb, \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0435\u0433\u043e \u043c\u044b \u0438 \u0434\u043e\u0431\u0438\u0432\u0430\u043b\u0438\u0441\u044c. \u0421\u043b\u0430\u0432\u043d\u043e. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435\u0445 \u0432\u0441\u0451 \u0440\u0430\u0434\u0443\u0435\u0442, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440. \u0421\u0430\u043c\u044b\u0439 \u0433\u043b\u0430\u0432\u043d\u044b\u0439, \u043a\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u043b\u0430\u0436\u0438\u0442\u044c \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440.<\/p>\n<h2>Generics<\/h2>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0440\u0432\u0451\u043c\u0441\u044f \u043e\u0442 \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438. \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0440\u0430\u044f \u0442\u0435\u043c\u0430. \u0418\u043b\u0438 \u0441\u043a\u043e\u043b\u044c\u0437\u043a\u0430\u044f, \u043a\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u0412 Java \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043d\u043e Kotlin \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0441 \u0432\u043e\u043b\u043d\u0443\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c. \u0427\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435?<\/p>\n<p>  \u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u2014 \u044d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438\u043b\u0438 \u043d\u0430 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438. \u0412\u043e\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b Animal \u0438 Dog \u0441 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u044c\u044e: Dog \u2014 \u044d\u0442\u043e \u043f\u043e\u0434\u0442\u0438\u043f, Animal \u2014 \u043d\u0430\u0434\u0442\u0438\u043f, \u0441\u0442\u0440\u0435\u043b\u043a\u0430 \u0438\u0434\u0451\u0442 \u043e\u0442 \u043f\u043e\u0434\u0442\u0438\u043f\u0430. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rz\/-b\/uz\/rz-buzyeywt0xgwewjvauwmf0lc.png\"><\/p>\n<p>  \u0410 \u043a\u0430\u043a\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u0431\u0443\u0434\u0435\u0442 \u0443 \u0438\u0445 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0435\u0439\u0441\u043e\u0432.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u044d\u0442\u043e Iterator. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0430\u0434\u0442\u0438\u043f, \u0430 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0442\u0438\u043f, \u043c\u044b \u0431\u0443\u0434\u0435\u043c, \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0443\u044f\u0441\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0411\u0430\u0440\u0431\u0430\u0440\u044b \u041b\u0438\u0441\u043a\u043e\u0432. \u0421\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:\u00ab\u043f\u043e\u0434\u0442\u0438\u043f \u0434\u043e\u043b\u0436\u0435\u043d \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435, \u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435\u00bb. <\/p>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Iterator \u2014 \u043e\u0442\u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Animal. \u0415\u0441\u043b\u0438 \u043c\u044b \u0433\u0434\u0435-\u0442\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c Iterator, \u043c\u044b \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u0442\u0443\u0434\u0430 Iterator, \u0438 \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 next() \u043f\u043e\u043b\u0443\u0447\u0438\u043c Animal, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u0431\u0430\u043a\u0430 \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 Animal. \u041c\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435, \u0430 \u0431\u043e\u043b\u044c\u0448\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u0431\u0430\u043a\u0430 \u2014 \u044d\u0442\u043e \u043f\u043e\u0434\u0442\u0438\u043f. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bz\/4e\/ra\/bz4eracdjm_ep_qnzk0mbkr5q7w.png\"><\/p>\n<p>  \u041f\u043e\u0432\u0442\u043e\u0440\u044e\u0441\u044c: \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0442\u0438\u043f\u043e\u043c \u0438 \u043f\u043e\u0434\u0442\u0438\u043f\u043e\u043c. \u0418 \u0442\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438. <\/p>\n<p>  \u0414\u0440\u0443\u0433\u043e\u0439 \u043a\u0435\u0439\u0441: Action. Action \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0438 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0448\u0435\u043c \u0432 Action, \u0442\u043e \u0435\u0441\u0442\u044c \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0443 \u043d\u0430\u0441 \u0441\u043e\u0431\u0430\u043a\u0443 \u0438\u043b\u0438 \u0436\u0438\u0432\u043e\u0442\u043d\u043e\u0435. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/h5\/hg\/74\/h5hg74k6id9rwtzfq1j2g1qsjyk.png\"><\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c, \u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u043c, \u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u00ab\u041d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435\u00bb \u0443 \u043d\u0430\u0441 Animal (Animal \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0441\u043e\u0431\u0430\u043a\u0430). \u0418 \u0442\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438. <\/p>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u0442\u0440\u0435\u0442\u0438\u0439 \u043a\u0435\u0439\u0441 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ArrayList, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0438 \u0447\u0438\u0442\u0430\u0435\u043c, \u0438 \u043f\u0438\u0448\u0435\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u043c \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0430\u0432\u0438\u043b, \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 (\u0441\u043e\u0431\u0430\u043a\u0443, \u0430 \u043d\u0435 \u0436\u0438\u0432\u043e\u0442\u043d\u043e\u0435). \u0422\u0430\u043a\u0438\u0435 \u0442\u0438\u043f\u044b \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c, \u0438 \u043e\u043d\u0438 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gj\/5o\/gp\/gj5ogpkqy1ifvtmxghqszew7fgk.png\"><\/p>\n<p>  \u0422\u0430\u043a \u0432\u043e\u0442, \u0432 Java, \u043a\u043e\u0433\u0434\u0430 \u0435\u0451 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0435\u0449\u0451 \u0434\u043e \u0432\u0435\u0440\u0441\u0438\u0438 1.5 (\u0433\u0434\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438), \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0432 \u043c\u0435\u0442\u043e\u0434, \u0433\u0434\u0435 \u043d\u0443\u0436\u0435\u043d \u043c\u0430\u0441\u0441\u0438\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0445\u043d\u0443\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u0445\u043e\u0442\u044f \u044d\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u0442\u0440\u043e\u043a. \u0412\u0441\u0451 \u0441\u0432\u0430\u043b\u0438\u0442\u0441\u044f \u0443 \u0432\u0430\u0441. <\/p>\n<p>  \u041d\u0430\u0443\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u0433\u043e\u0440\u044c\u043a\u043e\u043c \u043e\u043f\u044b\u0442\u0435, \u0447\u0442\u043e \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f, \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432 \u043e\u043d\u0438 \u0440\u0435\u0448\u0438\u043b\u0438 \u00ab\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0441 \u043d\u0438\u043c\u0438 \u0434\u0435\u043b\u0430\u0442\u044c\u00bb. <\/p>\n<p>  \u0418 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439 \u0448\u0442\u0443\u043a\u0435 \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u043a, \u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043d\u0435 \u043e\u043a:<\/p>\n<pre><code class=\"java\">\/\/ Java List&lt;Dog&gt; dogs = new ArrayList&lt;&gt;(); List&lt;Animal&gt; animals = dogs; <\/code><\/pre>\n<p>  \u041d\u043e \u043d\u0430\u043c \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c: \u0435\u0441\u043b\u0438 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043b\u0438\u0441\u0442\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0441\u044e\u0434\u0430 \u043b\u0438\u0441\u0442\u0430 \u0441\u043e\u0431\u0430\u043a? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e wildcard \u043e\u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e, \u043a\u0430\u043a\u0430\u044f \u0436\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0443 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430: <\/p>\n<pre><code class=\"java\">List&lt;Dog&gt; dogs = new ArrayList&lt;&gt;(); List&lt;? extends Animal&gt; animals = dogs; <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0430\u043c, \u0433\u0434\u0435 \u043c\u044b \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0441\u043e\u0431\u0430\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f use-site variance. <\/p>\n<p>  \u041a\u0430\u043a\u0438\u0435 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0443 \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c? \u041d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0432\u0430\u0448 API, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u044b\u0435 wildcard, \u0438 \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435. \u0410 \u0432\u043e\u0442 \u0432 Kotlin \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438, \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c: <\/p>\n<pre><code>val dogs: List&lt;Dog&gt; = ArrayList() val animals: List&lt;Animal&gt; = dogs <\/code><\/pre>\n<p>  \u0421 \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e? \u0421 \u0442\u0435\u043c, \u0447\u0442\u043e \u043b\u0438\u0441\u0442\u044b \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u043d\u044b\u0435. List \u0432 Java \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c, \u0430 \u0432 Kotlin \u043e\u043d immutable, \u043d\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u0441\u044e\u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u044b\u0442\u044c \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438. \u0418 \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0442\u0438\u043f\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u0441\u043b\u043e\u0432\u043e\u043c out, \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u043c wildcard:<\/p>\n<pre><code>interface List&lt;out E&gt; : Collection&lt;E&gt; <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f declaration-site variance. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432\u0441\u0451 \u0443\u043a\u0430\u0437\u0430\u043b\u0438, \u0438 \u0442\u0430\u043c, \u0433\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c, \u043c\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u043c \u044d\u0442\u0443 \u0442\u0435\u043c\u0443. \u0418 \u044d\u0442\u043e \u043d\u0438\u0448\u0442\u044f\u043a.<\/p>\n<h2>\u0421\u043d\u043e\u0432\u0430 \u043a \u043a\u043e\u0434\u0443<\/h2>\n<p>  \u041f\u043e\u0435\u0445\u0430\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043d\u0430\u0448\u0438 \u043f\u0443\u0447\u0438\u043d\u044b. \u0412\u043e\u0442 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 addPlugins, \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 List:<\/p>\n<pre><code>@JvmStatic fun addPlugins (plugs: List&lt;Plugin&gt;) {     plugs.forEach { addPlugin(it) } }  \u0410 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0435\u043c\u0443, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, List&lt;EmptyPlugin&gt;, \u043d\u0443, \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043a\u0430\u0441\u0442\u0438\u043b\u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u043e:  &lt;source lang=\"java\"&gt; final List&lt;EmptyPlugin&gt; pluginsToSet =      Arrays.asList(new LoggerPlugin(\"Alog\"), new SegmentPlugin()); <\/code><\/pre>\n<p>  \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e List \u0432 Kotlin \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u044e\u0434\u0430 \u043b\u0438\u0441\u0442 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043f\u043b\u0430\u0433\u0438\u043d\u0430. \u0412\u0441\u0451 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0432\u043e\u0437\u0440\u0430\u0436\u0430\u0435\u0442. \u041d\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c declaration-site variance, \u0433\u0434\u0435 \u043c\u044b \u0432\u0441\u0451 \u0443\u043a\u0430\u0437\u0430\u043b\u0438, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0442\u043e\u0433\u0434\u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 Java. \u0410 \u0447\u0442\u043e \u0436\u0435 \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u043c \u0442\u0443\u0434\u0430 \u043b\u0438\u0441\u0442 Plugin, \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0442\u0443\u0434\u0430 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432? \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442, \u043d\u043e \u0435\u0441\u0442\u044c \u0447\u0442\u043e? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0435\u0441\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f. \u0410 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f @JvmSuppressWildcards, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0442\u0438\u043f \u0441 wildcard, \u0442\u0438\u043f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439.<\/p>\n<pre><code>@JvmStatic fun addPlugins(plugs: List&lt;@JvmSuppressWildcards Plugin&gt;) {   plugs.forEach { addPlugin(it) } } <\/code><\/pre>\n<p>  \u0413\u043e\u0432\u043e\u0440\u044f SuppressWildcards, \u043c\u044b suppress&#8217;\u0438\u043c \u0432\u0441\u0435 \u044d\u0442\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u043a\u0438, \u0438 \u043d\u0430\u0448\u0430 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u0414\u0430\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u044f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u0432\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rn\/xp\/ft\/rnxpft1zqpioojczpiiyn1g3veo.png\"><\/p>\n<p>  \u0423\u0434\u0430\u043b\u044e \u043f\u043e\u043a\u0430 \u0438\u0437 \u043a\u043e\u0434\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e. \u0412\u043e\u0442 \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434. \u0412\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 type erasure. \u0418 \u0443 \u0432\u0430\u0441 \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u0437\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u043a\u0438-\u0442\u043e \u0431\u044b\u043b\u0438, \u043d\u0443 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0438. \u041d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u0430 \u044d\u0442\u0438\u043c \u0441\u043b\u0435\u0434\u0438\u0442 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445 \u043a \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0443: \u0430 \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u043a\u043e\u043c \u0442\u0438\u043f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/u4\/5e\/mm\/u45emmdne71zx9e9whz7uu8law0.png\"><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u043d\u043e\u0432\u0430 \u0432\u0441\u0442\u0430\u0432\u0438\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0438 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0443 \u043d\u0430\u0441 \u0442\u0438\u043f \u0431\u0435\u0437 \u0432\u043e\u043f\u0440\u043e\u0441\u0438\u043a\u043e\u0432. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cu\/if\/wm\/cuifwmem7zn636x3ky7n_41vuly.png\"><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u043e\u0442\u0440\u0443\u0431\u0438\u043b\u0438 Wildcards. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u044d\u0442\u043e\u043c \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u0438. <\/p>\n<p>  \u041c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0435 \u0442\u0438\u043f\u044b. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f. <\/p>\n<p>  \u041c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e List \u0443 \u043d\u0430\u0441 \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u043b\u0438\u0441\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0438\u0437 getPlugins, \u043e\u043d \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c. \u0410 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442? \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u0432 \u043d\u0435\u0433\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0438\u043f \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439, \u0430 \u043d\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 Java.<\/p>\n<pre><code class=\"java\">final List&lt;Plugin&gt; plugins = Analytics.getPlugins(); displayPlugins(plugins);  Analytics.getPlugins().add(new EmptyPlugin()); <\/code><\/pre>\n<p>  \u041d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u043e\u0437\u043c\u0443\u0449\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u043c\u044b \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u0440\u0430\u0432. \u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0435\u043c \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434, \u0442\u043e \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f \u0432 \u0432\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u043e\u0438\u0445 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u043d\u0438\u0439. \u041c\u044b \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u043d\u0435 \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u043b\u0438, \u0430 \u0442\u0438\u043f \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0431\u0435\u0437 \u0432\u043e\u043f\u0440\u043e\u0441\u0430. <\/p>\n<p>  \u0421\u044e\u0440\u043f\u0440\u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u0432\u043e\u0442 \u043d\u0430 \u0447\u0451\u043c. Kotlin \u043f\u043e\u0441\u0442\u0443\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0435\u0431\u044f, \u043a\u0430\u043a \u044f\u0437\u044b\u043a \u043f\u0440\u0430\u0433\u043c\u0430\u0442\u0438\u0447\u043d\u044b\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443, \u043a\u0430\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f wildcards \u0432 Java. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u0432\u0445\u043e\u0434 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u044e\u0442, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u044e\u0442 \u0442\u0438\u043f\u044b \u043a\u043e\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043d\u044b\u043c\u0438. \u041d\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0432\u0435\u0437\u0434\u0435, \u0433\u0434\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c List, \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c \u0442\u0443\u0434\u0430 \u043b\u0438\u0441\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 \u043e\u0442 Plugin. \u0410 \u0432\u043e\u0442 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0438\u043c\u0435\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u0435 \u0442\u0438\u043f\u044b: \u043a\u0430\u043a \u0435\u0441\u0442\u044c \u043b\u0438\u0441\u0442 Plugin, \u0442\u0430\u043a \u043e\u043d \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d.<\/p>\n<p>  \u0418 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u043e\u043e\u0447\u0438\u044e \u0432\u0438\u0434\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u044d\u0442\u043e\u0433\u043e. \u042d\u0442\u043e \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e, \u0437\u0430\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442 \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043e\u0434\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0443\u0434\u043d\u044b\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u044b\u0439 usecase, \u0438 \u0435\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c \u043a\u0430\u043a\u0438\u043c\u0438-\u0442\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u0430\u043c\u0438, \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. <\/p>\n<p>  \u041d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0435 \u0434\u043b\u044f \u043d\u0430\u0441, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c. \u0418 \u0442\u0430\u043a\u0436\u0435 \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 Java. \u0412 Kotlin \u0437\u0434\u0435\u0441\u044c List \u2014 \u044d\u0442\u043e immutable-\u0442\u0438\u043f, \u0438 \u043c\u044b \u0442\u0443\u0434\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0430 \u043f\u0440\u0438\u0448\u0435\u043b \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0430\u0448\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u0437 Java \u0438 \u043d\u0430\u043f\u0438\u0445\u0430\u043b \u0442\u0443\u0434\u0430 \u0432\u0441\u0451 \u043f\u043e\u0434\u0440\u044f\u0434 \u2014 \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f \u0437\u0430\u0444\u043e\u0440\u0441\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b List \u0441 wildcard. \u0418 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043a\u0430\u043a. \u0414\u043e\u0431\u0430\u0432\u0438\u0432 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e @JvmWildcard \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c: \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439 \u043d\u0430\u043c \u0442\u0438\u043f \u0441 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 Java \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435. Java \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u0447\u0442\u043e \u0442\u044b \u0434\u0435\u043b\u0430\u0435\u0448\u044c?\u00bb:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/su\/v_\/1r\/suv_1rnnuub7bsqlod-oglgra74.png\"><\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0434\u0435\u0441\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 List&lt;? extends Plugin&gt;, \u043d\u043e \u043e\u043d\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u00ab\u0447\u0442\u043e \u0442\u044b \u0434\u0435\u043b\u0430\u0435\u0448\u044c?\u00bb \u0418, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u044d\u0442\u0430 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0430\u0441 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442. \u041d\u043e \u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f script kiddie, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043a\u0430\u0436\u0435\u0442 \u00ab\u044f \u0436\u0435 \u0432\u0438\u0434\u0435\u043b \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u044d\u0442\u043e \u0436\u0435 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441, \u044f \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0442\u0430\u043c ArrayList, \u0438 \u044f \u0432\u0430\u0441 \u043f\u043e\u0445\u0430\u0447\u0443\u00bb. \u0418 \u0432\u0441\u0451 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e ArrayList \u0438 \u043e\u043d \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0443\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c.<\/p>\n<pre><code class=\"java\">((ArrayList&lt;Plugin&gt;) Analytics.getPlugins()).add(new EmptyPlugin()); <\/code><\/pre>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u043b\u0451\u0432\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0442\u044c, \u043d\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c defensive-\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0432\u043d\u044b\u043c-\u0434\u0430\u0432\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e. \u0421\u043e\u0440\u044f\u043d, \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043d\u0438\u043a\u0443\u0434\u0430, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b script kiddies \u0432\u0430\u0441 \u043d\u0435 \u043f\u043e\u0445\u0430\u0447\u0438\u043b\u0438. <\/p>\n<pre><code>@JvmStatic fun getPlugins(): List&lt;@JvmWildcard Plugin&gt; =      plugin.toImmutableList() <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044e \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e @JvmSuppressWildcard \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0442\u043e\u0433\u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u0437\u043d\u0430\u0442\u044c, \u0442\u0430\u043a \u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0442\u0430\u043a \u0438 \u043d\u0430 \u0432\u0435\u0441\u044c \u043a\u043b\u0430\u0441\u0441, \u0442\u043e\u0433\u0434\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0435\u0433\u043e \u0437\u043e\u043d\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>  \u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u0441 \u043d\u0430\u0448\u0435\u0439 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a\u043e\u0439 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c. \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0434\u0440\u0443\u0433\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u043e\u0439\u0442\u0438: \u043f\u043b\u0430\u0433\u0438\u043d. <\/p>\n<p>  \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 Java. \u041a\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043f\u0430\u0446\u0430\u043d\u044b, \u043c\u044b \u0440\u0435\u043f\u043e\u0440\u0442\u0438\u043c \u0435\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"java\">@Override public void send(@NotNull Event event)   throws IOException <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u0432\u0441\u0451 \u0432\u0438\u0434\u043d\u043e:  <\/p>\n<pre><code>interface Plugin {     fun init()     \/** @throws IOException if sending failed *\/     fun send(event: Event)      \/\/ ... } <\/code><\/pre>\n<p>  \u0412 Kotlin \u0436\u0435 \u043d\u0435\u0442 checked exception. \u0418 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438: \u0441\u044e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043a\u0438\u0434\u0430\u0442\u044c. \u041d\u0443 \u043c\u044b \u0438 \u043a\u0438\u0434\u0430\u0435\u043c, \u043a\u0438\u0434\u0430\u0435\u043c, \u043a\u0438\u0434\u0430\u0435\u043c. \u0410 Java \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e. \u0413\u043e\u0432\u043e\u0440\u0438\u0442: \u00ab\u0430 \u043d\u0435\u0442 Throws \u043f\u043e\u0447\u0435\u043c\u0443-\u0442\u043e \u0432 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435, \u043c\u0435\u0441\u044c\u0435\u00bb:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/g-\/v8\/go\/g-v8gog8gwfa-on0anv0bkwktsk.png\"><\/p>\n<p>  \u0410 \u043a\u0430\u043a \u0442\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c-\u0442\u043e, \u0442\u0443\u0442 \u0436\u0435 Kotlin? \u041d\u0443, \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435 \u043e\u0442\u0432\u0435\u0442\u2026<\/p>\n<p>  \u0415\u0441\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f @Throws, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0438 \u0434\u0435\u043b\u0430\u0435\u0442. \u041e\u043d\u0430 \u043c\u0435\u043d\u044f\u0435\u0442 throws-\u0447\u0430\u0441\u0442\u044c \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430. \u041c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u043c \u043a\u0438\u043d\u0443\u0442\u044c \u0441\u044e\u0434\u0430 IOEx\u0441eption:<\/p>\n<pre><code>open class EmptyPlugin : Plugin {     @Throws(IOException::class)     override fun send(event: Event) {}      \/\/ ... } <\/code><\/pre>\n<p>  \u0418 \u0435\u0449\u0451 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0437\u0430\u043e\u0434\u043d\u043e \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:<\/p>\n<pre><code>interface Plugin {     fun init()     \/** @throws IOException if sending failed *\/     @Throws(IOException::class)     fun send(event: Event)      \/\/ ... } <\/code><\/pre>\n<p>  \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u0447\u0442\u043e? \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u043f\u043b\u0430\u0433\u0438\u043d, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Java, \u0433\u0434\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e\u0431 exception, \u0432\u0441\u0435\u043c \u0434\u043e\u0432\u043e\u043b\u0435\u043d. \u0412\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u043d\u0430 \u044d\u0442\u043e\u043c \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u0432\u0441\u0451, \u043d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0434\u0432\u0430 \u043d\u044e\u0430\u043d\u0441\u0430 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c @JvmName. \u041e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439. <\/p>\n<p>  \u041c\u044b \u0432\u0441\u0435 \u044d\u0442\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 Java \u0431\u044b\u043b\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e. \u0410 \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c\u2026<\/p>\n<pre><code>package util  fun List&lt;Int&gt;.printReversedSum() {     println(this.foldRight(0) { it, acc -&gt; it + acc }) }  @JvmName(\"printReversedConcatenation\") fun List&lt;String&gt;.printReversedSum() {     println(this.foldRight(StringBuilder()) { it, acc -&gt; acc.append(it) }) } <\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043d\u0430 Java \u043d\u0430\u043c \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e, \u0443\u0431\u0435\u0440\u0451\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e. \u041e\u043f\u0430\u0447\u043a\u0438, \u0442\u0435\u043f\u0435\u0440\u044c IDE \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043e\u0431\u0435\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445. \u041a\u0430\u043a \u0432\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0435, \u0441 \u0447\u0435\u043c \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e? \u0414\u0430, \u0431\u0435\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043e\u043d\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438, \u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e \u043e\u0434\u0438\u043d \u043d\u0430 List, \u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430 List. \u0412\u0435\u0440\u043d\u043e, type erasure. \u041c\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u043b\u043e: <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qk\/oq\/jr\/qkoqjrub5xc4mdn-twq-s_jehl4.png\"><\/p>\n<p>  \u0412\u044b \u0443\u0436\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435, \u043a\u0430\u043a \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0432\u0441\u0435 top-level \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043ac\u0442\u0435. \u0418 \u0432\u043e\u0442 \u0431\u0435\u0437 \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c printReversedSum \u043e\u0442 List, \u0430 \u043d\u0438\u0436\u0435 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0442\u043e\u0436\u0435 \u043e\u0442 List. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e Kotlin-\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0437\u043d\u0430\u0435\u0442 \u043e \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u0430\u0445, \u0430 Java-\u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043d\u0435 \u0437\u043d\u0430\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 kotlin.jvm \u043d\u0443\u0436\u043d\u044b \u043d\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 Java \u0431\u044b\u043b\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0443\u0434\u043e\u0431\u043d\u043e, \u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0430\u0448 Kotlin \u0441\u043e\u0431\u0440\u0430\u043b\u0441\u044f. \u0417\u0430\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u043e\u0435 \u0438\u043c\u044f \u2014 \u0440\u0430\u0437 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438, \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c concatenation \u2014 \u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. <\/p>\n<p>  \u0418 \u0432\u0442\u043e\u0440\u043e\u0439 \u044e\u0437\u043a\u0435\u0439\u0441. \u041e\u043d \u0441\u0432\u044f\u0437\u0430\u043d \u0432\u043e\u0442 \u0441 \u0447\u0435\u043c. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c extension-\u0444\u0443\u043d\u043a\u0446\u0438\u044f reverse.<\/p>\n<pre><code>inline fun String.reverse() =   StringBuilder(this).reverse().toString()  inline fun &lt;reified T&gt; reversedClassName() = T::class.java.simpleName.reverse()  inline fun &lt;T&gt; Iterable&lt;T&gt;.forEachReversed(action: (T) -&gt; Unit) {   for (element in this.reversed()) action(element) } <\/code><\/pre>\n<p>  \u042d\u0442\u043e\u0442 reverse \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f ReverserKt.<\/p>\n<pre><code class=\"java\">private static void useUtils() {     System.out.println(ReverserKt.reverse(\"Test\"));      SumsKt.printReversedSum(asList(1, 2, 3, 4, 5));      SumsKt.printReversedConcatenation(asList(\"1\", \"2\", \"3\", \"4\", \"5\")); } <\/code><\/pre>\n<p>  \u042d\u0442\u043e, \u044f \u0434\u0443\u043c\u0430\u044e, \u043d\u0435 \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0432\u0430\u0441. \u041d\u044e\u0430\u043d\u0441 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0443\u0432\u0430\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0448\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 Java, \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u043b\u0430\u0434\u043d\u043e\u0435. \u041c\u044b \u043f\u0440\u043e\u0441\u043e\u0447\u0438\u043b\u0438 \u0434\u0435\u0442\u0430\u043b\u0438 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0443 \u044e\u0437\u0435\u0440\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u043c\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0438 \u0441\u043b\u0435\u0434\u044b. \u041a\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c? \u041a\u0430\u043a \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 @JvmName, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e, \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441. <\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0435\u0439 \u0442\u0430\u043a\u043e\u0435 \u0438\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u043e\u0442\u0438\u043c, \u043d\u0435 \u043f\u0430\u043b\u0438\u043c\u0441\u044f, \u0438 \u0432\u0430\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u043d\u0430 \u0444\u0430\u0439\u043b\u0435, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0444\u0430\u0439\u043b.<\/p>\n<pre><code>@file:Suppress(\"NOTHING_TO_INLINE\") @file:JvmName(\"ReverserUtils\") <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 \u0432 Java \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f ReverserKt, \u043d\u043e \u044d\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 ReverserUtils \u0438 \u0432\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b. \u0418 \u0442\u0430\u043a\u043e\u0439 \u00ab\u044e\u0437\u043a\u0435\u0439\u0441 2.1\u00bb \u2014 \u0447\u0430\u0441\u0442\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0430\u0448\u0438\u0445 top-level \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434 \u043e\u0434\u043d\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u043f\u043e\u0434 \u043e\u0434\u043d\u0438\u043c \u0444\u0430\u0441\u0430\u0434\u043e\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e \u0432\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u0448\u0435\u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e sums.kt \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0438\u0437 SumsKt, \u0430 \u0445\u043e\u0442\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u0432\u0441\u0451 \u0442\u043e\u0436\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e reversing \u0438 \u0434\u0451\u0440\u0433\u0430\u043b\u043e\u0441\u044c \u0438\u0437 ReverserUtils. \u0422\u043e\u0433\u0434\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438 \u0442\u0443\u0434\u0430 \u044d\u0442\u0443 \u0447\u0443\u0434\u043d\u0443\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e @JvmName, \u043f\u0438\u0448\u0435\u043c \u00abReverserUtils\u00bb, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0432\u0441\u0451 \u043e\u043a, \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u043d\u0435\u0442. <\/p>\n<p>  \u0425\u043e\u0442\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0440\u0435\u0434\u0430 \u043d\u0435 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0435\u0442, \u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043d\u0430\u043c \u0441\u043a\u0430\u0436\u0443\u0442, \u0447\u0442\u043e \u00ab\u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 \u0441 \u043e\u0434\u0438\u043d \u0438\u043c\u0435\u043d\u0435\u043c, \u0430\u0442\u0430-\u0442\u0430\u00bb. \u0427\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c? \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432 \u044d\u0442\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e @JvmMultifileClass, \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0443\u044e, \u0447\u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u0438\u043d \u0444\u0430\u0441\u0430\u0434.<\/p>\n<p>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 &#171;@file:JvmMultifileClass&#187;, \u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c SumsKt \u043d\u0430 ReverserUtils, \u0432\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b \u2014 \u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043c\u043d\u0435. \u0421 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438!<\/p>\n<p>  \u041c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0441 \u0432\u0430\u043c\u0438 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u0430\u043a\u0435\u0442\u0435, \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u0445. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u0443\u0436\u0435 \u0438\u0437 \u0438\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u0430\u044f. \u0415\u0441\u0442\u044c \u0445\u0438\u0442\u0440\u044b\u0435 \u043a\u0435\u0439\u0441\u044b, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, @JvmName \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 Kotlin. <\/p>\n<h2>Kotlin-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0435<\/h2>\n<p>  \u041d\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0451, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0443\u0437\u043d\u0430\u0442\u044c. \u0415\u0449\u0451 \u0432\u0430\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Kotlin-\u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u043c\u0438 \u0432\u0435\u0449\u0430\u043c\u0438. <\/p>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, inline-\u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041e\u043d\u0438 \u0432 Kotlin \u0438\u043d\u043b\u0430\u0439\u043d\u044f\u0442\u0441\u044f \u0438, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0430 \u0431\u0443\u0434\u0443\u0442 \u043b\u0438 \u043e\u043d\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u0437 Java \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435? \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0431\u0443\u0434\u0443\u0442, \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f Java. \u0425\u043e\u0442\u044f \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Kotlin-only \u043f\u0440\u043e\u0435\u043a\u0442, \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0432\u0430\u0448\u0435\u043c dex count limit. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 Kotlin \u043e\u043d\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0443\u0442.<\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0434\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c Reified type parameters. \u0422\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b \u0434\u043b\u044f Kotlin, \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0438\u043d\u043b\u0430\u0439\u043d-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u043e\u0440\u043e\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0445\u0430\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 Java \u0441 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0435\u0439 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b. \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e Kotlin-only \u0448\u0442\u0443\u043a\u0430, \u043e\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f Kotlin, \u0438 \u0432 Java \u0432\u044b \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 reified, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e.<\/p>\n<p>  java.lang.Class. \u0415\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043d\u0430\u0448\u0430 \u0438 \u0434\u043b\u044f Java, \u0442\u043e \u0438 \u0435\u0451 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440. \u0415\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u043e\u0439 \u00ab\u0441\u0432\u043e\u0439 Retrofit\u00bb, \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435 (\u044f \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0435\u0433\u043e \u043f\u0430\u0440\u043d\u0438 \u0442\u0430\u043a \u0434\u043e\u043b\u0433\u043e \u043f\u0438\u0441\u0430\u043b\u0438):<\/p>\n<pre><code>class Retrofit private constructor(     val baseUrl: String,     val client: Client ) {     fun &lt;T : Any&gt; create(service: Class&lt;T&gt;): T {...}      fun &lt;T : Any&gt; create(service: KClass&lt;T&gt;): T {       return create(service.java)     } } <\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c Java, \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u043e\u0442\u043b\u0438\u043d\u043e\u0432\u0441\u043a\u0438\u043c KClass, \u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c extension-\u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 KClass \u0434\u043e\u0441\u0442\u0430\u044e\u0442 Class, \u0438\u0437 Class \u0434\u043e\u0441\u0442\u0430\u044e\u0442 KClass (\u043e\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f Kotlin, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e).<\/p>\n<p>  \u042d\u0442\u043e \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u0438\u0434\u0438\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e. \u0412 Kotlin-\u043a\u043e\u0434\u0435 \u0432\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0435 KClass, \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Reified-\u0442\u0438\u043f\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u0443\u0447\u0448\u0435 \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439:<\/p>\n<pre><code>inline fun &lt;reified T : Any&gt; create(): T {     return create(T::class.java.java) <\/code><\/pre>\n<p>  \u0412\u0441\u0451 \u0448\u0438\u043a\u0430\u0440\u0434\u043e\u0441. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0439\u0434\u0451\u043c \u0432 Kotlin \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u0430 \u0448\u0442\u0443\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u0422\u0430\u043c <i>val api = retrofit.create(Api::class)<\/i> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 <i>val api = retrofit.create&lt;Api&gt;()<\/i>, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u044f\u0432\u043d\u044b\u0445 ::class \u043d\u0435 \u0432\u044b\u043b\u0435\u0437\u0430\u0435\u0442. \u042d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Reified-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0438 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0441\u0443\u043f\u0435\u0440-\u043f\u0443\u043f\u0435\u0440.<\/p>\n<p>  Unit. \u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Unit, \u0442\u043e \u043e\u043d\u0430 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 void \u0432 Java, \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c\u043e. \u041d\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u0433\u0434\u0435 \u0443 \u0432\u0430\u0441 \u043b\u044f\u043c\u0431\u0434\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u044e\u043d\u0438\u0442\u044b. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u043e Scala, \u0442\u043e \u0432 Scala \u0435\u0441\u0442\u044c \u0432\u0430\u0433\u043e\u043d \u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u0442\u0435\u043b\u0435\u0436\u043a\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0438 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0432\u0430\u0433\u043e\u043d \u0441 \u0442\u0435\u043b\u0435\u0436\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043d\u0438\u0447\u0435\u0433\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u0441 void.<\/p>\n<p>  \u0410 \u0432 Kotlin \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0442. \u0412 Kotlin \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 22 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438 \u0447\u0442\u043e-\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043b\u044f\u043c\u0431\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Unit, \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0435 void, \u0430 Unit. \u0418 \u044d\u0442\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f. \u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043b\u044f\u043c\u0431\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Unit? \u0412\u043e\u0442, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0435\u0451 \u0432 \u044d\u0442\u043e\u043c \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0435 \u043a\u043e\u0434\u0430. \u041f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043c\u0441\u044f. <\/p>\n<pre><code>inlint fun &lt;T&gt; Iterable&lt;T&gt;.forEachReversed(action: (T) -&gt; Unit) {     for (element in this.reversed()) action(element) } <\/code><\/pre>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0435\u0451 \u0438\u0437 Kotlin: \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0430\u0436\u0435 method reference, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u0435\u043c, \u0438 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0433\u043b\u0430\u0437\u0430 \u043d\u0435 \u043c\u043e\u0437\u043e\u043b\u0438\u0442.<\/p>\n<pre><code>private fun useMisc() {     listOf(1, 2, 3, 4).forEachReversed(::println)  println(reversedClassName&lt;String&gt;()) } <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 Java? \u0412 Java \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u0431\u0430\u0439\u0434\u0430:<\/p>\n<pre><code class=\"java\">private static void useMisc() {     final List&lt;Integer&gt; list = asList(1, 2, 3, 4);     ReverserUtils.forEachReversed(list, integer -&gt; { \tSystem.out.println(integer);  \treturn Unit.INSTANCE;   }); <\/code><\/pre>\n<p>  \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0437\u0434\u0435\u0441\u044c. \u042d\u0442\u043e \u043a\u0430\u043a Void \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0443\u043a\u0432\u044b, \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u0431\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e. \u041c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434 \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 void, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e. \u0418 \u044d\u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u043e\u043a\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0437\u043e\u043b\u0438\u0442 \u0433\u043b\u0430\u0437\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0445 \u043d\u0430\u0448\u0438\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0430\u043d\u0441 Unit \u043e\u0442\u0441\u044e\u0434\u0430. \u041c\u043e\u0436\u043d\u043e null, \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043e\u043d \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d. \u0412 \u0441\u043c\u044b\u0441\u043b\u0435, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  \u041f\u043e\u0435\u0445\u0430\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435: Typealiases \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u043b\u0438\u0430\u0441\u044b \u0438\u043b\u0438 \u0441\u0438\u043d\u043e\u043d\u0438\u043c\u044b, \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 Kotlin, \u0438 \u0432 Java, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0434 \u044d\u0442\u0438\u043c\u0438 \u0430\u043b\u0438\u0430\u0441\u0430\u043c\u0438. \u041b\u0438\u0431\u043e \u044d\u0442\u043e \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0430 \u0442\u0440\u0438\u0436\u0434\u044b \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a\u043e\u0432, \u043b\u0438\u0431\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b. Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0441 \u044d\u0442\u0438\u043c \u0436\u0438\u0442\u044c. <\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435: visibility. \u0410 \u0442\u043e\u0447\u043d\u0435\u0435, internal visibility. \u0412\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0432 Kotlin \u043d\u0435\u0442 package private, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u0431\u0435\u0437 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 public. \u0417\u0430\u0442\u043e \u0435\u0441\u0442\u044c internal. Internal \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0445\u0438\u0442\u0440\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u0447\u0442\u043e \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430 \u043d\u0435\u0451 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c. \u0412 Retrofit \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c internal-\u043c\u0435\u0442\u043e\u0434 validate. <\/p>\n<pre><code>internal fun validate(): Retrofit {     println(\"!!!!!! internal fun validate() was called !!!!!!\")     return this } <\/code><\/pre>\n<p>  \u041e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d \u0438\u0437 Kotlin, \u0438 \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441 Java? \u041c\u043e\u0436\u0435\u043c \u043b\u0438 \u043c\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c validate? \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0434\u043b\u044f \u0432\u0430\u0441 \u043d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442, \u0447\u0442\u043e internal \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 public. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0432\u0435\u0440\u0438\u0442\u0435 \u043c\u043d\u0435, \u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435 Kotlin bytecode viewer.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cc\/mr\/ts\/ccmrtst8oqwmbdvgn4onk8jlrus.png\"><\/p>\n<p>  \u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e public, \u043d\u043e \u0441 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u0448\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u043c\u0435\u043a\u0430\u0435\u0442 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u0447\u0442\u043e \u044d\u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0430\u043a \u0431\u044b\u043b\u043e \u0437\u0430\u0434\u0443\u043c\u0430\u043d\u043e, \u0447\u0442\u043e \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435 API \u043f\u0440\u043e\u043b\u0435\u0437\u0430\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0430. \u0415\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 80 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u043b\u0435\u0437\u0442\u044c \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443. <\/p>\n<p>  \u0412 Java \u0443 \u043d\u0430\u0441 \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u0430\u043a: <\/p>\n<pre><code class=\"java\">final Api api = retrofit     .validate$production_sources_for_module_library_main()     .create(Api.class);  api.sendMessage(\"Hello from Java\"); } <\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u043b\u043e. \u0422\u0430\u043a, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u044d\u0442\u043e \u043d\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0443\u0436\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e. \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f, \u043d\u043e let me explain this to you. \u0427\u0442\u043e, \u0435\u0441\u043b\u0438 \u044f \u0441\u0434\u0435\u043b\u0430\u044e \u0432\u043e\u0442 \u0442\u0430\u043a?<\/p>\n<pre><code class=\"java\">final Api api = retrofit     .validate$library()     .create(Api.class);  api.sendMessage(\"Hello from Java\"); } <\/code><\/pre>\n<p>  \u0422\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0418 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a?\u00bb \u0427\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c\u2026 MAGIC!<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432 internal, \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u043e\u0447\u0438\u0442\u0441\u044f \u0432 \u0432\u0430\u0448\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435 API. \u0418 \u0435\u0441\u043b\u0438 script kiddie \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u043e\u0440\u0443\u0436\u0451\u043d Kotlin Bytecode Viewer, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043b\u043e\u0445\u043e. \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u0441 internal visibility.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0434\u043e\u0441\u0442\u0438, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0434\u0432\u0435 \u0432\u0435\u0449\u0438. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u043e\u043c \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0434\u043e\u043a\u043b\u0430\u0434 \u043e\u0442 \u0416\u0435\u043d\u044c\u043a\u0438 \u0412\u0430\u0440\u0442\u0430\u043d\u043e\u0432\u0430, \u0435\u0441\u0442\u044c <a href=\"https:\/\/skillsmatter.com\/skillscasts\/10012-keynote-sinking-your-teeth-into-bytecode\">\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e<\/a>, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0441 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u044f SkillsMatter. \u041e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e. <\/p>\n<p>  \u0418 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u0442\u0430\u0440\u0430\u044f <a href=\"https:\/\/medium.com\/@BladeCoder\/exploring-kotlins-hidden-costs-part-1-fbb9935d9b62\">\u0441\u0435\u0440\u0438\u044f<\/a> \u0438\u0437 \u0442\u0440\u0451\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043e\u0442 \u041a\u0440\u0438\u0441\u0442\u043e\u0444\u0430 \u0411\u0435\u0439\u043b\u0441\u0430 \u043f\u0440\u043e \u0442\u043e, \u0432\u043e \u0447\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 Kotlin-\u0444\u0438\u0447\u0438. \u0422\u0430\u043c \u0432\u0441\u0451 \u043a\u043b\u0430\u0441\u0441\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e, \u0447\u0442\u043e-\u0442\u043e \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u0432\u0435\u0441\u044c\u043c\u0430 \u0434\u043e\u0445\u043e\u0434\u0447\u0438\u0432\u043e. \u0412\u0441\u0451 \u0442\u043e\u0436\u0435 \u0441 Kotlin bytecode viewer \u0438 \u0432\u0441\u0451 \u0442\u0430\u043a\u043e\u0435.<\/p>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: 8-9 \u0434\u0435\u043a\u0430\u0431\u0440\u044f \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 <b>Mobius<\/b>, \u0438 \u0442\u0430\u043c \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e. \u0423\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u2014 <a href=\"https:\/\/mobiusconf.com\">\u043d\u0430 \u0441\u0430\u0439\u0442\u0435<\/a>, \u0438 \u0431\u0438\u043b\u0435\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u0442\u0430\u043c \u0436\u0435.  <\/p><\/blockquote>\n<\/div>\n<p>        <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/post\/417951\/\"> https:\/\/habr.com\/post\/417951\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div data-io-article-url=\"https:\/\/habr.com\/company\/jugru\/blog\/417951\/\" class=\"post__text post__text-html js-mediator-article\">\u0421\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e Kotlin \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u043d\u0435\u0441\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u043e\u0432\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439: \u044f\u0437\u044b\u043a \u0432\u0435\u0434\u044c Java-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 Java-\u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043d\u0435\u0433\u043e, \u043d\u0435 \u0437\u0430\u0431\u0438\u0432\u0430\u044f \u043d\u0438\u0447\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u0443, \u0442\u0430\u043a? \u041d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u0442\u044c \u0433\u043b\u0443\u0431\u0436\u0435, \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u0448\u043a\u0430\u0442\u0443\u043b\u043a\u0435 \u043d\u0430\u0439\u0434\u0451\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0434\u043d\u043e, \u0430 \u0432 \u0442\u0440\u044e\u043c\u043e \u2014 \u043f\u043e\u0442\u0430\u0439\u043d\u0430\u044f \u0434\u0432\u0435\u0440\u0446\u0430. \u042f\u0437\u044b\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u0445\u0438\u0442\u0440\u044b\u0445 \u043d\u044e\u0430\u043d\u0441\u043e\u0432.<\/p>\n<p>  \u0420\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u00ab\u0432\u0441\u0451 \u043f\u043b\u043e\u0445\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Kotlin \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Java \u043d\u0435 \u043d\u0430\u0434\u043e\u00bb, \u0430 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0437\u043d\u0430\u0442\u044c \u043e \u043d\u044e\u0430\u043d\u0441\u0430\u0445 \u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0445. \u041d\u0430 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 <b>Mobius<\/b> \u0421\u0435\u0440\u0433\u0435\u0439 \u0420\u044f\u0431\u043e\u0432 <a href=\"https:\/\/mobiusconf.com\/2017\/msk\/talks\/jslrnocqzieusmswmg0w0\/\">\u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b<\/a>, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 Kotlin \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u0434, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0438\u0437 Java. \u0418 \u0434\u043e\u043a\u043b\u0430\u0434 \u0442\u0430\u043a \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0437\u0440\u0438\u0442\u0435\u043b\u044f\u043c, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0448\u0438\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e\u0437\u0430\u043f\u0438\u0441\u044c, \u043d\u043e \u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043b\u044f \u0425\u0430\u0431\u0440\u0430 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.2493%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/1L0q5VKx_-s?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\"><\/iframe><\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-288412","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/288412","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=288412"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/288412\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=288412"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=288412"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=288412"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}