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,>
davy.ai
Cuando se trata de seguridad de tipos e herencia, el
Map<string, b="">
no es compatible conMap<string, a="">
aunqueB
herede deA
. Esto se debe a que los genéricos en Dart son invariables, lo que significa que unaList<b>
no puede ser utilizada como unaList<a>
, y de manera similar, unMap<string, b="">
no puede ser utilizado como unMap<string, a="">
.En el código proporcionado, la razón por la cual las tres funciones
goofy
,croc
yfrape
funcionan como se espera es debido al uso de la palabra clavedynamic
en el tipo de parámetro de las funcionescroc
yfrape
. Esto básicamente desactiva la comprobación de tipos para el parámetromap
y permite que se le asigne unMap<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 tiposA
oB
. 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,>