为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中展示协方差和逆变?

在Java中展示协方差和逆变?

凤凰求蛊 2019-08-26 09:36:02
在Java中展示协方差和逆变?请给出Java中协方差和逆变的一个很好的例子。
查看完整描述

3 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

协方差:

class Super {
  Object getSomething(){}}class Sub extends Super {
  String getSomething() {}}

Sub#getSomething是协变的,因为它返回Super#getSomething的返回类型的子类(但是满足Super.getSomething()的合同)

逆变

class Super{
  void doSomething(String parameter)}class Sub extends Super{
  void doSomething(Object parameter)}

Sub#doSomething是逆变的,因为它需要Super#doSomething参数的超类参数(但是,再次填写Super#doSomething的合约)

注意:此示例在Java中不起作用。Java编译器会重载并且不会覆盖doSomething() - Method。其他语言确实支持这种逆转方式。

泛型

这也适用于泛型:

List<String> aList...List<? extends Object> covariantList = aList;List<? super String> contravariantList = aList;

您现在可以访问covariantList不带泛型参数的所有方法(因为它必须是“extends Object”),但getter将正常工作(因为返回的对象将始终为“Object”类型)

反之亦然contravariantList:您可以使用泛型参数访问所有方法(您知道它必须是“String”的超类,因此您始终可以传递一个)但没有getter(返回的类型可以是String的任何其他类型) )


查看完整回答
反对 回复 2019-08-26
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

看看Liskov替代原则。实际上,如果B类扩展了A类,那么只要需要A就可以使用B。


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 392 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信