答案:java中可以用T或其他大写字母代替一个未知的类型,例如 定义类的时候 class A<T>中的T就是一个范型,T可以代替任何类型或者类。
问题:为什么java的范型是一个假范型??
答案:因为java的代码在编译成class文件之后,会将范型给去掉。会用object代替范型。所以java的范型是假范型。
例如:
`
public (T) List<T> get(List<T> obj){
}
编译之后变成:
public List<Object> get(List obj) {
}
`
问题:为什么java中用范型进行重载不可以??
例如代码如下:
class A {
public void say(List<Integer> a) {
}
public void say(List<String> b) {
}
}
上述代码,会报错,为什么呢???因为java在编译之后,会将范型给去掉,所以编译之后代码是如下:
class A {
public void say(List a) {
}
public void say(List b) {
}
}
两个方法是一摸一样的,而在java中同一个方法不能存在两个,所以会报错。
问题:为什么jdk1.6中返回值不同的两个范型的方法,可以同时存在??
例如代码如下:
class A {
public Integer say(List<Integer> a) {
return 0;
}
public String say(List<String> b) {
return null;
}
}
答案:因为java代码中确认唯一方法(特征签名)是根据方法名+参数顺序+参数类型,而在字节吗中确认唯一方法(特征签名)是根据返回值+方法名+参数顺序+参数类型+异常表。因为返回值不同,所以编译通过之后上面两个方法是唯一确认的。不过仅仅在jdk1.6中可以,其余版本编译不通过,会报错。因为在java代码中就会认为他们是一样的。