Java SE5中添加协变返回类型,表示在导出类中的被覆盖方法可以返回基类方法的返回类型的某种导出类型。

如现有:导出类WheatMill,被覆盖方法process(),基类Mill,基类方法的返回类型Grain,其导出类型Wheat。

类文件

Mill.java:基类

[toggle hide="no" title="基类Mill" color=""]

/**

* 磨坊; 工厂; 磨粉机; 榨汁机;

*/

public class Mill {

Grain process(){

return new Grain();

}

}

[/toggle]

Grain.java:基类方法的返回类型

[toggle hide="no" title="基类方法的返回类型Grain" color=""]

/**

* 谷物(Grain ),可以在工厂(Mill)中被加工(process)

*/

public class Grain {

private String name;

@Override

public String toString() {

return "Grain{}---谷物";

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

[/toggle]

WheatMill.java:Mill的导出类(即其子类)

[toggle hide="no" title="基类Mill的导出类WheatMill" color=""]

/**

* 工厂/磨坊(Mill)的导出类小麦磨坊(Mill)

*

*/

public class WheatMill extends Mill {

/**

* 重写Mill的process()方法

* 协变返回类型允许返回更具体的Wheat类型,亦即此时的Wheat为协变返回类型

* @return

*/

Wheat process(){

return new Wheat();

}

}

[/toggle]

Wheat.java:谷物(Grain)的导出类小麦(Wheat)

[toggle hide="no" title="基类Mill的导出类WheatMill" color=""]

/**

* 谷物(Grain)的导出类小麦(Wheat)

*/

public class Wheat extends Grain{

private String color;

@Override

public String toString() {

return "Wheat{}---小麦: " + getName() + " , the color :"+ this.color;

}

public String getColor() {

return color;

}

public void setColor(String color) {

this.color = color;

}

}

[/toggle]

CovariantReturnDemo.java:运行demo

[toggle hide="no" title="测试类CovariantReturnDemo" color=""]

/**

*By windcoder.com

*/

public class CovariantReturnDemo {

public static void main(String[] args) {

// 创建基类Mill的实例m

Mill m = new Mill();

// 获取m的返回类型Grain的实例g

Grain g = m.process();

//设置g的名称并打印

g.setName("windCoder.com");

System.out.println(g);

System.out.println(g.getName());

//将m重新分配给其类型(基类Mill)的导出类(WheatMill),由于m自身是Mill,此时自动向上转型

m = new WheatMill();

//获取m的返回类型Grain的实例g

g =m.process();

g.setName("bulu");

//! g.setColor("red"); //---此时g的类型依旧是基类Grain,故不存在其子类(Wheat)中的setColor()方法

System.out.println(g);

System.out.println(g.getName());

// 因为是协变返回类型,所以可以向下转型

Wheat w = (Wheat) g;

w.setColor("red");

System.out.println(g);

}

}

[/toggle]

运行结果

Grain{}---谷物: heihei

heihei

Wheat{}---小麦: bulu , the color :null

bulu

Wheat{}---小麦: bulu , the color :red

解析

与较早版本差别:

较早版本将强制process()的覆盖版必须返回Grain,而不能返回Wheat。

但Wheat是从Grain导出的,因而也应该是一种合法的返回类型。

协变返回类型允许返回更具体的Wheat类型

扩:

里氏代换原则(任何基类可以出现的地方,子类一定可以出现)

重写/覆盖规则:

1.重写方法不能比被重写方法限制有更严格的访问级别。

2.参数列表必须与被重写方法的相同。

3.返回类型必须与被重写方法的返回类型相同。

4.重写方法不能抛出新的异常或者比被重写方法声明的检查异常更广的检查异常。但是可以抛出更少,更有限或者不抛出异常。

5.不能重写被标识为final的方法。

6.如果一个方法不能被继承,则不能重写它。如private方法

可见此处demo中WheatMill对Mill的process()方法的重写违反了重写规则3,但Wheat属于Grain的子类(即Wheat IS-A Grain),所以在向上的继承树转换时会隐式完成。此处的Wheat即成了协变返回类型。

java 数组 协变类型6_Java漫谈-协变返回类型相关推荐

  1. mal是什么类型对应的java类型是什么,【Java】mysql的 int 类型,刨析返回类型为BigDicemal 类型的奇怪现象...

    用的是Map,List>接收, sql语句中int类型的值做了聚合运算, 满足上述两个条件. java中去取value的值就会变成BigDecimal 类型 经过实测:mybatis 中的sql ...

  2. mysql int和bigdecimal,mysql的 int 类型,刨析返回类型为BigDicemal 类型的奇怪现象

    用的是Map,List>接收, sql语句中int类型的值做了聚合运算, 满足上述两个条件. java中去取value的值就会变成BigDecimal 类型 经过实测:mybatis 中的sql ...

  3. C++ decltype类型说明符(尾置返回类型使用)

    转自https://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 decltype 类型说明符生成指定表达式的类型.在此过程中,编译器分析 ...

  4. java数组和链表6_java的数组和链表从熟系到陌生

    s[1][2] = 26; 数组实现数据结构: 数据结构的作用:模拟生活中的数据存储:对数据进行增删改查 和数据库的区别 对该同学信息进行增删改查 数据库是把数据存到磁盘里面,他支持可调定式 电脑存数 ...

  5. 教妹学Java(三十二):了解 Java 中的返回类型协变

    你好呀,我是沉默王二,(目前是)CSDN 周排名前十的博客专家.这是<教妹学 Java>专栏的第二十七篇,今天我们来谈谈 Java 中的返回类型协变--Java 的返回值类型支持协变.换句 ...

  6. C++动态绑定及返回类型协变

    C++多态之动态绑定:   1.概念:在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调用相应的方法. 使用virtual关键字修饰类的成员函数时,指明该函数为虚函数,派生类需要重新 ...

  7. java statement 返回类型,6.3 返回类型和返回语句 | Return type Return statement

    无返回值函数 对于返回类型是void的函数,return后不跟表达式.最后的 return; 可以没有而让程序隐式执行.在void函数中的return语句还有提前使函数退出的作用而不进行接下来的计算, ...

  8. 写出一下Java方法对应的签名_Java中的方法签名是否包含其返回类型?

    Java类/接口中的方法签名是否包括其返回类型? 例: Java是否知道这两种方法之间的区别: public class Foo { public int  myMethod(int param) { ...

  9. java 类没有返回类型,返回类型的Java方法编译时没有return语句

    问题 问题1: 为什么以下代码在没有return语句的情况下编译? public int a() { while(true); } 注意:如果我在一段时间后添加返回,那么我得到aUnreachable ...

最新文章

  1. 知名财经大V称:京东金融遇到了点“问题”!
  2. oracle转金额,ORACLE金额转换成英文大写的函数
  3. 服务器安装系统时无法创建新的分区,重装系统出现“我们无法创建新的分区,也找不到现有的分区”...
  4. mysql 的独占锁和排它锁_MySQL的排它锁与共享锁
  5. 在React中处理事件
  6. HDU - 2828 网络流
  7. hangfire 过期记录_黄浦回收豆沙月饼公司,过期饼干回收厂家
  8. qt 不允许 dllimport 静态数据成员 的定义_C++类和对象的定义
  9. Python爬虫基本代码附解析
  10. 如何快速调出软键盘_天生我材必有用 | 如何快速的计算和调用防火阀、调节阀、铝合金风口等材料价格...
  11. 嵌入式 Web Server 温度检测系统
  12. 小白的网站seo经验
  13. LIO-SAM回环检测模块代码解析
  14. html关于图片缓慢放大
  15. 计算机linux二级试题,计算机二级考试题及答案
  16. 【广度优先搜索】leetcode 994. 腐烂的橘子
  17. DC-DC电源设计[基于MP2315]
  18. 威斯康星麦迪逊计算机科学专业,威斯康星大学麦迪逊分校计算机科学专业申请条件汇总...
  19. 国家开放大学2021春2623中医药学概论题目
  20. 从摩斯密码到UTF-8

热门文章

  1. 整理了4000字的Google数据可视化指南!
  2. 中国探月工程首席科学家欧阳自远:“嫦娥”月面图千真万确
  3. C++实现简单的工资管理系统
  4. jQuery点击按钮新增dom
  5. 排产易!APS系统如何选型?(上)
  6. RSA非对称加密解密实现
  7. 管理经济学知识点汇总
  8. 定位人工智能时代的“拍照机器人”,美图M8为何能撂倒Angelababy等明星
  9. Shader攻占笔记(八)屏幕特效
  10. windows模拟微信小程序_【原创】PC微信小程序包解密工具C#版无需root或模拟器