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后引入的一个概念:
协变返回类型