He estado buscando durante un tiempo una solución adecuada para esto.

Lo que me gustaría hacer es agregar una cantidad específica de objetos vacíos a una lista en el método init.

abstract class TypedMaxLengthMutableList<T>() : MutableList<T> {
    protected val innerList = mutableListOf<T>()
    protected val maxSize = 4

    init {
        for (i in 1..maxSize)
            this.innerList.add(???)
    }

    ... method overrides for MutableList
}

He leído sobre variantes, invariantes, covariantes, tipos, clases, etc ...

Pero hasta ahora no he podido descifrar esta.

¿Podría alguien ayudarme aquí?

1
Johan Vergeer 17 feb. 2018 a las 11:51

2 respuestas

La mejor respuesta

El problema que veo es que no hay ningún objeto vacío para ningún tipo T.

Puede pasar este objeto "predeterminado" como parámetro:

abstract class TypedMaxLengthMutableList<T>(default: T) : MutableList<T> {
    protected val innerList = mutableListOf<T>()
    protected val maxSize = 4

    init {
        repeat(maxSize) {
            this.innerList.add(default)
        }
    }

    ... method overrides for MutableList
}
0
voddan 17 feb. 2018 a las 08:56

No puede invocar el constructor de T directamente porque los genéricos se borran en tiempo de ejecución en la JVM; el código compilado no tendrá ningún concepto de a qué se refiere T en cada instancia particular de TypedMaxLengthMutableList.

Para solucionar este problema, dispone de las siguientes opciones:

  • Pase una instancia de objeto vacía como parámetro de constructor, como sugiere voddan;
  • Pasa una lambda que crea una instancia de T (() -> T) e invocala para cada elemento que estás agregando
  • Pase una instancia de Class o KClass que represente el tipo de T e invoque su constructor sin argumentos a través de la reflexión.
2
yole 17 feb. 2018 a las 09:18