Articles of удлинительные методы

Метод Kotlin inline не видим, если не расширять класс

Я столкнулся с проблемой в библиотеке, которую я пишу для коллекций нулевого мусора. Я написал функцию myFunction но у меня есть проблема, когда я НЕ могу вызвать функцию, если я не RandomClass класс (в данном случае) RandomClass package com.charlatano fun main(args: Array<String>) { val hello = RandomClass<String>() hello.myFunction { // Unresolved reference: myFunction } } […]

метод расширения для класса утилиты из внешней библиотеки

Я использую FilenameUtils из apache commons У меня было такое действие в коде val customPath = FilenameUtils.getPath(source) + DEFAULT_SEPARATOR + FilenameUtils.getBaseName(source) val resultPath = FilenameUtils.separatorsToSystem(customPath) Я решил сделать это в методе расширения. Я переместил его в отдельный класс. object PluginExtensions { fun FilenameUtils.normalizeFilePath(source: String) : String { val customPath = FilenameUtils.getPath(source) + DEFAULT_SEPARATOR + FilenameUtils.getBaseName(source) […]

Использовать метод / свойство расширения по всему миру

В Kotlin вы можете определить методы и свойства расширения для существующих классов: operator inline fun Vector2.plus(other: Vector2) = Vector2(x + other.x, y + other.y) Это позволяет сделать это: val result = Vector2(1.1f, 2.3f) + Vector2(2f, 4f) Есть ли способ сделать это расширение глобальным, так что мне не нужно импортировать его в каждый класс, который использует […]

Как вызвать методы расширения вне класса, в котором они определены?

Вот минимальный пример, демонстрирующий проблему: abstract class Base { abstract fun String.extension(x: Char) } class Derived : Base() { override fun String.extension(x: Char) { // Calling lots of methods on String, hence extension method println("${first()} $length ${last()} ${firstOrNull { it == x }} …") } } Вызов метода расширения из Java тривиален: Base o = […]