读书人

JAVA是不是允许返回值类型不同的重载o

发布时间: 2012-12-25 16:18:28 作者: rapoo

JAVA是否允许返回值类型不同的重载overload或覆盖override?
重载是一定不允许的。比如

class Super{void f(){}int f(){return 1;}}


原因在与如果调用时int i = f();可以知道是调用Sub的f()。但是,往往用户不关心返回值。只是f()。这样就无法确定到底是哪个。

覆盖一般情况是不允许的。比如

class Super{void f(){}}class Sub extends Super{int f(){return 1;}}


编译会报错。
但是有办法可以不同(表面上不同)。比如

class Grain{public String toString(){return "Grain";}}class Wheat extends Grain{public String toString(){return "Wheat";}}class Mill{Grain process(){//注意返回值return new Grain();}}class WheatMill extends Mill{Wheat process(){//注意返回值return new Wheat();}}public class CovariantReturn {public static void main(String[] args) {Mill m = new Mill();Grain g = m.process();System.out.println(g);m = new WheatMill();g = m.process();System.out.println(g);}}


这样是完全可以的,运行结果

Grain
Wheat

其实也并不难理解,因为子类本身就可以看做是父类。这个是JAVA1.5后引入的一个概念:
协变返回类型



读书人网 >编程

热点推荐