问题描述
两个概念不太明白,求解释下~
解决方案
解决方案二:
https://zh.wikipedia.org/wiki/%E5%8D%8F%E5%8F%98%E4%B8%8E%E9%80%86%E5%8F%98看看这个你就懂了
解决方案三:
引用1楼mrjia的回复:
https://zh.wikipedia.org/wiki/%E5%8D%8F%E5%8F%98%E4%B8%8E%E9%80%86%E5%8F%98看看这个你就懂了
嗯,里面讲的参数是抗变的,和C#相反。这样说对吧:协变,子类作父类用;抗变,父类作子类用。还有C#的参数类型是将子类赋给父类,可以叫做协变,但是返回的类型也是将子类型返回的,怎么成了抗变了?求讲解,谢谢~
解决方案四:
引用1楼mrjia的回复:
https://zh.wikipedia.org/wiki/%E5%8D%8F%E5%8F%98%E4%B8%8E%E9%80%86%E5%8F%98看看这个你就懂了
等一下,你们是怎么能访问中文维基的?我这都墙到现在了
解决方案五:
简单地讲:有个函数F1接受的参数是A1类型,返回值是B1类型A1a1;B1b1=F1(a1);另一个函数F2,接受的参数是A1的子类A2类型,返回值是B1类型A2a2;B1b1=F2(a2);F2当然也就可以接受A1类型的参数,返回B1类型的返回值A1a1;B1b1=F2(a1);也就是说在这里F2可以起到代替F1的效果。另一个函数F0,接受的参数是A1类型,返回值是B1的父类B0类型A1a1;B0b0=F0(a1);把返回值赋值给B1类型的变量就不行了A1a1;B1b1=F0(a1);//会报错,缺少一个类型转换也就是说在这里F0不可以起到代替F1的效果。反过来,F1可以起到替代F0的效果A1a1;B0b0=F1(a1);
解决方案六:
引用4楼yangyi_2009的回复:
简单地讲:有个函数F1接受的参数是A1类型,返回值是B1类型A1a1;B1b1=F1(a1);另一个函数F2,接受的参数是A1的子类A2类型,返回值是B1类型A2a2;B1b1=F2(a2);F2当然也就可以接受A1类型的参数,返回B1类型的返回值A1a1;B1b1=F2(a1);也就是说在这里F2可以起到代替F1的效果。另一个函数F0,接受的参数是A1类型,返回值是B1的父类B0类型A1a1;B0b0=F0(a1);把返回值赋值给B1类型的变量就不行了A1a1;B1b1=F0(a1);//会报错,缺少一个类型转换也就是说在这里F0不可以起到代替F1的效果。反过来,F1可以起到替代F0的效果A1a1;B0b0=F1(a1);
刚才接了个电话犯糊涂了,无视这个回复吧。
解决方案七:
逆变:有个函数F1接受的参数是A1类型voidF1(a1);另一个函数F2,接受的参数是A1的子类A2类型voidF2(a2);F2不能当F1用,传a1的参数进去F2(a1)会报错F1能当F2用,可以传a2的参数进去F1(a2)协变:有个函数G1返回是B1类型B1G1();另一个函数G0,返回值是B1的父类B0类型B0G0();G0不能当G1用,返回值赋值给B1类型变量b1=G0()会报错G1能当G0用,返回值可以赋值给B0类型变量b0=G1()