Java 协变返回类型是指在子类中重写一个方法时,该方法的返回类型可以是父类中该方法返回类型的子类。这意味着子类可以返回更具体的类型,而无需强制转换为父类类型。

例如,假设有一个父类 Animal 和一个子类 Dog,它们都有一个返回类型为 Animal 的方法 getAnimal。在 Dog 类中重写该方法时,可以将返回类型更改为 Dog,因为 Dog 是 Animal 的子类。这样一来,当调用 Dog 的 getAnimal 方法时,会返回一个 Dog 对象而不是 Animal 对象。

导出类(子类)覆盖(即重写)基类(父类)方法时,返回的类型可以是基类方法返回类型的子类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.evada.de;
/**
* @Author 云析学院
* Created by Ay on 2016/12/4.
*/
public class Ay {

public static void main(String[] args) {
Person person = new Boy();
Flower flower = person.buy();
flower.like();
//! flower.love(); 编译错误
//因为是协变返回类型,所以可以向下转型
RoseFlower roseFlower = (RoseFlower) person.buy();
//可以调用like方法
roseFlower.like();
//可以调用love方法
roseFlower.love();
}
}
class Person{
public Flower buy(){
System.out.println("Flower...");
return new Flower();
}
}
/**
* 男孩
*/
class Boy extends Person{

/**
* 这里覆盖Person类的buy
* @return
*/
@Override
public RoseFlower buy(){
System.out.println("RoseFlower...");
//注意这里,这里就是协变返回类型
//导出类**(子类)覆盖(即重写)**基类**(父类)方法时,
// 返回的类型可以是基类方法返回类型的子类
return new RoseFlower();
}
}
class Flower{
/**
* 让普通人喜欢
*/
public void like(){
System.out.println("like");
}
}
class RoseFlower extends Flower{
/**
* 让程序员喜欢
*/
public void love(){
System.out.println("love....");
}
}