GOOGLE ADS

jueves, 21 de abril de 2022

¿Cómo resolver "el método de interfaz no debe tener parámetros de tipo"?

Estoy probando los genéricos en 1.18beta2 y estoy tratando de escribir una capa de abstracción para el almacén de clave/valor, boltdb. Esto es lo que estoy tratando de lograr con él.

type Reader interface {
Read(bucket []byte, k...[]byte) ([][]byte, error)
ReadDoc[V Unmarshaler](bucket []byte, factory func() (V, error), k...[]byte) ([]V, error)
}
type Unmarshaler interface {
UnmarshalKV(v []byte) error
}

De modo que pueda proporcionarle una fábrica para crear el tipo cuando encuentre una clave/valor, descomponga los datos en él y devuelva una porción de ese tipo específico. Solo obtengo "el método de interfaz no debe tener parámetros de tipo" del compilador. ¿Por qué no se permiten parámetros de tipo en las interfaces? ¿Está planeado apoyar esto? Esto ha aplastado mis sueños... Habría sido perfecto. Sin embargo, funciona fuera de la interfaz.


Solución del problema

Me encontré con el mismo problema hoy. Esta parece ser una decisión de diseño para los parámetros genéricos/de tipo, ya que podría haber múltiples "formas" de interpretar un método con parámetros de tipo en la definición de la interfaz (y el trabajo de implementación).

En algunos casos podría significar:


  • No se conserva la identidad del argumento.

  • Necesita recorrer todo el árbol en tiempo de compilación, lo que afecta el rendimiento.

  • Necesidad de reflexión en tiempo de ejecución, lo que afecta el rendimiento.

  • El método parametrizado no implementa interfaces, lo que generaría confusión.


Más información en la propuesta de Parámetros tipo, Métodos no parametrizados

Sin embargo, puede mover el parámetro de tipo a la definición de tipo de interfaz. Propuesta, resumen de muy alto nivel:

type Reader[V Unmarshaler] interface {
Read(bucket []byte, k...[]byte) ([][]byte, error)
ReadDoc(bucket []byte, factory func() (V, error), k...[]byte) ([]V, error)
}
type Unmarshaler interface {
UnmarshalKV(v []byte) error
}

No hay comentarios.:

Publicar un comentario

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...