Как привести Список, полученный в основном конструкторе, к MutableList, чтобы мы могли делегировать класс MutableList - PullRequest
0 голосов
/ 03 июня 2019

Я хочу реализовать интерфейс MutableList от kotlin, добавив некоторые поточно-ориентированные функции, и если я хочу реализовать интерфейс MutableList и переопределить только то, что небезопасно для потока, поэтому я выбрал делегирование.

Каждый раз, используя List.toMutableList (), он возвращает новый экземпляр MutableList, содержащий все элементы данных.

class ThreadSafeList<E> constructor(data: List<E>): MutableList<E> by data.toMutableList() //different reference (new object created when using toMutableList())
{
    private val data = data.toMutableList() //different reference (new object created when using toMutableList())
    ...

    //default constructor when no argument is supplied
    constructor(): this(listOf())

    //override, locks & stuffs for thread safety
}

Expectation: Я хочу привести List к MutableList в самом конструкторе, чтобы делегат реализации содержал ту же ссылку, что и данные val, но я не могу найти, как это сделать.

1 Ответ

1 голос
/ 03 июня 2019

После долгих исследований я наконец нашел способ сделать это.

Я объясню, как я это сделал. Это может помочь всем, кто страдает от этой проблемы,

class ThreadSafeList<E> private constructor(private val data: MutableList<E>): MutableList<E> by data
{
    // default constructor, when no elements are passed
    constructor(): this(mutableListOf())

    companion object {
        // constructor for a list to use its elements for the purpose
        operator fun <E> invoke(elements: List<E>): ThreadSafeList<E>
        {
            return ThreadSafeList(elements.toMutableList())
        }
    }
}


fun main()
{
    // this is how you call it
    val list = listOf("Hello", "World", "!")
    val threadSafeList = threadSafeListOf(list)
}

Вот что я сделал, может быть, взломать, но это работает как шарм.Вот почему я люблю kotlin.

Вы можете создать объект, как обычно, не нужно добавлять при вызове при создании объекта, так как это автоматически выполняется компилятором kotlin при передачесписок к нему.

...