es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Compatibilidad de tipos de argumentos

Me pregunto si mi pensamiento es correcto o si estoy cometiendo algún error grave. Veamos un código simple:

class A { String a = "a"; }

class B extends A { String b = "b"; }

void goofy(Map<string, a=""> map) {
  A? item = map["b1"];
  print(item?.a);
}

void croc(dynamic map) {
  final A? item = (map as Map<string, a="">)["b1"];
  print(item?.a);
}

void frape(dynamic map) {
  final A? item = (map["b1"]) as A;
  print(item?.a);
}

void main() {
  Map<string, b=""> mapInst = {"b1": B()};
  goofy(mapInst);
  croc(mapInst);
  frape(mapInst);

  Map<string, a=""> mapInst2 = {"b1": A()};
  goofy(mapInst);
  croc(mapInst);
  frape(mapInst);
}

Todas las funciones goofy, croc y frape funcionan según lo esperado. Sin embargo, no estoy tan seguro acerca de las firmas. ¿Es compatible Map<string,a> con Map<string,b> ya que B hereda de A? ¿O esto es solo un efecto secundario y en realidad importa que el tipo base sea Map y los genéricos no se tomen en consideración? ¿Qué sintaxis se recomienda para la situación en la que quiero pasar Maps que pueden tener tipos A o B en la firma genérica? ¿Quizás solo Map simple?</string,b></string,a></string,></string,></string,></string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Cuando se trata de seguridad de tipos e herencia, el Map<string, b=""> no es compatible con Map<string, a=""> aunque B herede de A. Esto se debe a que los genéricos en Dart son invariables, lo que significa que una List<b> no puede ser utilizada como una List<a>, y de manera similar, un Map<string, b=""> no puede ser utilizado como un Map<string, a="">.

    En el código proporcionado, la razón por la cual las tres funciones goofy, croc y frape funcionan como se espera es debido al uso de la palabra clave dynamic en el tipo de parámetro de las funciones croc y frape. Esto básicamente desactiva la comprobación de tipos para el parámetro map y permite que se le asigne un Map<string, b=""> a pesar de que la firma de la función sugiere lo contrario.

    Para garantizar la seguridad de tipos y la herencia adecuada, se recomienda utilizar la firma Map<string, a=""> cuando se desee pasar mapas que pueden tener tipos A o B. Esto evitará cualquier efecto secundario no deseado o errores que puedan ocurrir al utilizar un mapa que no es seguro en cuanto a tipos.</string,></string,></string,></string,></string,></string,>

Comments are closed.