Расширение Kotlin на интерфейсе - PullRequest
0 голосов
/ 08 июня 2018

Допустим, у меня есть interface Base, и мы реализуем этот интерфейс в class Base1 : Base.

Я ожидаю, что функция расширения в форме

fun ArrayList<Base>.myFun()

также будет работатьarrayListOf(Base1(), Base1()).myFun(), но это не так.Требуется, чтобы список был типа Base вместо Base1.

Разве это не странно?Или я просто что-то упускаю?

И каковы мои варианты написания функции, доступной для всех подклассов интерфейса?

Спасибо!

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

Допустим, у вас есть:

interface Base
class Base1: Base
class Base2: Base

Чтобы получить удовольствие от каждого класса, расширяющего ваш интерфейс, вы должны создать класс с общим расширением:

fun <T : Base> ArrayList<T>.myFun() = arrayListOf<T>()

В этом случае вы делаете расширение для любого ArrayList, контейнерным классом которого будет любой класс, выходящий из вашего Base интерфейса.Точно так же он вернет массив данных этого типа.

В коде это будет выглядеть так:

fun myCode(){
    val array1 : ArrayList<Base1> = arrayListOf(Base1()).myFun()
    val array2 : ArrayList<Base2> = arrayListOf(Base2()).myFun()
}

Вы можете узнать больше об этом в официальной документации, он имеет многообщих примеров: https://kotlinlang.org/docs/reference/extensions.html

0 голосов
/ 08 июня 2018

Это:

fun ArrayList<Base>.myFun()

является расширением только для ArrayList<Base>.

. Вы можете сделать функцию универсальной, чтобы поддерживать любые реализации Base:

fun <T : Base> ArrayList<T>.myFunc() {}

Использование:

ArrayList<Base1>().myFunc()
0 голосов
/ 08 июня 2018

Вам нужно разрешить функции расширения принимать дочернюю реализацию

interface Base
class Base1: Base

fun ArrayList<out Base>.myFun() = println(toString())

fun main(args: Array<String>) {
    arrayListOf(Base1(), Base1()).myFun()

}
0 голосов
/ 08 июня 2018

Это должно работать со списком массивов любого типа:

fun <T> ArrayList<T>.myFun()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...