1.协变式覆盖
在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。这样有什么好处呢?以Object类的clone方法为例:
class Object {
...
public Object clone() { ... }
}
在5.0以前,如果子类需要重载clone方法,必须像下面这样写代码:
class Point {
public int x;
public int y;
public Point(int x, int y) { this.x=x; this.y=y; }
public Object clone() { return new Point(x,y); }
}
虽然在我们的Point类里,clone方法总是返回一个Point类型的对象,但却必须把返回类型写成Object,在外部使用clone方法时也必须使用恼人的强制类型转换。
在Java5.0以后,我们就可以利用新的覆盖规则,像下面这样编写代码:
class Point {
public int x;
public int y;
public Point(int x, int y) { this.x=x; this.y=y; }
public Point clone() { return new Point(x,y); }
}
这样,我们就可以直接使用Point p2 = p1.clone(); 而不用强制类型转换了。
2.泛型重载
Java的方法重载一般指在同一个类中的两个同名方法,规则很简单:两个方法必须具有不同的方法签名。换句话说,就是这两个方法的参数必须不相同,使得编译器能够区分开这两个重载的方法。由于编译器不能仅仅通过方法的返回值类型来区分重载方法,所以如果两个方法只有返回类型不同,其它完全一样,编译是不能通过的。
在泛型方法的重载时,这个规则稍微有一点变化。先看下面代码:
class Overloaded {
public static int sum(List<Integer> ints) {
int sum = 0;
for (int i : ints) sum += i;
return sum;
}
public static String sum(List<String> strings) {
StringBuffer sum = new StringBuffer();
for (String s : strings) sum.append(s);
return sum.toString();
}
}
上面是两个泛型方法的重载例子,由于Java的泛型采用擦除法实现,List<Integer>和List<String>在运行时是完全一样的,都是List类型。也就是,擦除后的方法签名如下:
int sum(List)
String sum(List)
Java允许这两个方法进行重载,虽然它们的方法签名相同,只有返回值类型不同。这在两个普通方法的重载中是不允许的。当然了,如果两个泛型方法的参数在擦除后相同,而且返回值类型也完全一样,那编译肯定是不能通过的。
类似地,一个类不能同时继承两个具有相同擦除类型的父类,也不能同时实现两个具有相同擦除的接口。如Class A implements Comparable<Integer>, Comparable<Long>。
总结一下,两个泛型方法在擦除泛型信息后,如果具有相同的参数类型,而返回值不一样,是可以进行重载的。Java有足够的信息来区分这两个重载的方法。
文章出处:http://www.diybl.com/course/3_program/java/javaxl/20071220/92738.html
分享到:
相关推荐
Java中的集合类与泛型机制(Java SE 1.5中加入了泛型机制)
集合与泛型知识点的总结
泛型类、泛型方法、泛型接口、泛型委托 泛型类、泛型方法、泛型接口、泛型委托
STL与泛型编程(C++版)。
Java.SE 自定义泛型与泛型的常见陷阱Java.SE 自定义泛型与泛型的常见陷阱
泛型程式设计与STL.pdf 欢迎下载
泛型Service:GenericService.java 与泛型dao没有区别 Service :PersonService.java 直接继承。 泛型serviceimpl与serviceimpl实现和dao层实现一样。 Action : SavePersonAction直接调用PersonService。 ...
泛型集合解释的非常好泛型集合泛型集合泛型集合解释的非常好泛型集合泛型集合泛型集合解释的非常好泛型集合泛型集合泛型集合解释的非常好泛型集合泛型集合
泛型与泛型继承知识:大家一起来学习,多多沟通,共同进步
在.NET FCL为我们提供了很多...结论:如果在C#2.0版本以上,尽量使用泛型集合类,而不使用非泛型集合类。因为,1. 泛型编程是从c#2.0开始才被.net支持的。2.泛型集合在性能和类型安全方面优于非泛型集 合。 。。。。
C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型
大局观泛型程式设计与STL.zip 侯捷先生的经典好书
C++程序设计与实践:11-模板和泛型编程.ppt
java集合与泛型[参照].pdf
泛型编程与STL.pdf
java泛型BaseDao与BaseService
接口+泛型+函数式编程案例
C#中的集合与泛型应用实例,针对集合与泛型进行详细讲解,代码简单易懂。
java数据结构,泛型与集合框架,有各种集合运算的算法,Collection接口介绍,数组方法介绍等
本代码资源是一个关于Java语言中泛型的讲解案例代码。通过使用实际的示例代码,详细讲解了泛型的定义、用法和优势。 适用人群: 有一定Java编程基础的开发者;对泛型概念感兴趣或希望加深理解的学习者。 使用场景...