Notas genéricas de Kotlin (1)

Tipo de parámetro

Los genéricos permiten la definición de tipos con parámetros de tipo . Cuando se crea una instancia de este tipo, los parámetros de tipo se reemplazan por tipos concretos llamados argumentos de tipo

Ejemplo

// 源码listOf函数声明
fun <T> listOf(vararg elements: T): List<T>

val list=listOf("hello","world") // 编译器推导

val list= listOf<String>()// 显示说明

En el ejemplo anterior, T es un parámetro de tipo y el tipo de retorno de la función usa un parámetro de tipo

la diferencia

  • Kotlin requiere que los argumentos de tipo se especifiquen explícitamente o que el compilador pueda deducirlos
  • Kotlin no admite tipos primitivos, los argumentos de tipo deben definirse
  • Java permite el uso de tipos genéricos sin parámetros de tipo (tipos ecológicos originales) porque admite la compatibilidad con versiones anteriores del código.

Funciones y clases genéricas

Clase genérica

Kotlin declara clases genéricas e interfaces genéricas agregando un par de marcas de verificación definidas después del nombre de la clase y colocando los parámetros de tipo dentro de las marcas de verificación definidas. Una vez declarados, los parámetros de tipo se pueden usar en el cuerpo de la clase como otros tipos.

// 泛型类
class Gen<T>(private var t: T) {
    
    
    fun  getValue() :T{
    
    
        return t
    }
}

// 泛型接口
interface List<T>{
    
    
  public operator fun get(index: Int): T
}

Resumen: Si la clase hereda la clase genérica (implementa la interfaz genérica), debe proporcionar un argumento de tipo para el parámetro genérico del tipo base , que puede ser un tipo concreto u otro parámetro de tipo:

class GenList:List<String>{
    
    
 override fun get(index :Int):String=...
}

class ArrayList<T>:List<T>{
    
    
override fun get(index :Int):T=...
}

Función genérica

Las funciones genéricas tienen sus propios parámetros de tipo , estos parámetros de tipo deben reemplazarse con argumentos de tipo específicos cada vez que se llama a la función

fun <T> printMessage(msg :T){
    
    
    when (content) {
    
    
       is Int ->{
    
    "该信息数据类型是整型"}
       else ->{
    
    "该信息数据类型不是整型"}
    }
}

Nota: Los atributos ordinarios (es decir, no extendidos) no pueden tener parámetros de tipo y no pueden almacenar múltiples valores de diferentes tipos en los atributos de una clase, por lo tanto, no tiene sentido declarar funciones genéricas no extendidas.

Restricciones de parámetros de tipo

Las restricciones de parámetro de tipo pueden limitar las funciones genéricas y la clase genérica como el tipo de argumento de tipo; si el tipo especificado es un tipo genérico del parámetro de restricción de límite superior, en particular el tipo genérico de inicialización, que corresponde al tipo de sólido El parámetro debe ser este tipo concreto o su subtipo

Ejemplo

// 函数声明
fun <T:Number> List<T>.sum() :T

// 具体类型实参继承了Number,函数调用是允许的
println(listOf(1,2,3).sum())

En el ejemplo anterior, la restricción se define especificando el límite superior después del parámetro de tipo. Coloque los dos puntos después del nombre del parámetro de tipo, y el tipo como el límite superior del parámetro de tipo sigue inmediatamente; una vez que el límite superior del parámetro de tipo se especifica el parámetro de tipo T, puede usar el valor del tipo T como el valor de su límite superior (tipo)

El parámetro de tipo no está vacío ni acepta valores NULL.

Si la declaración es una clase genérica o una función genérica, cualquier argumento de tipo, incluidos los argumentos de tipo que aceptan valores NULL, puede reemplazar sus parámetros de tipo; los parámetros de tipo que no especifican el límite superior utilizarán el valor predeterminado Any?


// 类型参数可空  默认上界的类型形参是Any?
class Person<T>{
    
    
  fun name(value :T){
    
    
    value?.hashcode()
  }
}

// 类型参数非空   默认上界的类型形参是Any
class Person<T:Any>{
    
    
  fun name(value :T){
    
    
    value?.hashcode()
  }
}

Nota : Puede hacer que el parámetro de tipo no sea nulo especificando cualquier tipo que no esté vacío como límite superior, no solo el tipo Cualquiera

Supongo que te gusta

Origin blog.csdn.net/xufei5789651/article/details/102837146
Recomendado
Clasificación