范型
只在编译阶段有效,编译后,jvm会去除范型,也就是说在运行阶段范型是没有效果的。
Java 语言中泛型只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型,并且在相应的地方插入了强制类型转换的代码。因此对于运行期的 Java 语言来说, ArrayList 与 ArrayList 是同一个类型,所以泛型实际上是 Java 语言的一个语法糖,这种泛型的实现方法称为类型擦除。
范型通配符
1. 无边界通配符:?
public void print(List<?> list){
for(int i=0;i<list.size();i++){
system.out.print(list.get(i));
}
}
2.上边界通配符:?extends Number
通用的类型必须是Number及其子类,本例中就是必须是Long、Double、Byte、Integer、Short、Float中的一中;
3.下边界通配符:?super Integer
通用类型必须是Integer及其父类,本例中就必须是Integer、Number、Object中的一种,否则报错
范型使用
范型需要先声明在使用;范型的声明使用"<>"实现;
//没有声明范型的情况
public T fund(T t){
return (T)null;
}
//声明范型的情况:范型声明<T>
public <T> T fund(T t){
return (T)null;
}
范型类
范型类,可以增加代码的灵活度,
public class Person <T> {
private T t;
public void set(T t){
this.t = t;
}
public T get(){
return t;
}
}
范型方法
普通方法,可以使用类上定义的范型,也可以使用方法上定义地的范型,
public class Demo <K,V> {
//1、使用类定义的范型
public K get(K k,V v){
return (K)null;
}
//2、使用方法定义的范型
public <T> T getT(T t,V v){
return (K)null;
}
//3、静态方法中,不可以使用类中定义地的范型,只能使用方法中定义的范型
public static <K> K method(){
return (K)null;
}
}
静态方法中,不可以使用类中定义地的范型,只能使用方法中定义的范型
范型接口
定义一个加法计算的接口
public interface Generic{
add(int a,int b);
}
public class IntGeneric impliments Generic{
add(int a,int b){
return a+b;
}
}
以上是一个已经实现了接口的字类;但是,如果现在需要计算double类型的加法运算,这时接口就不能满足,需要重新添加接口,这是不是很麻烦;
以上需求可以通过范型接口来实现,这样以来就可以在添加和修改接口的情况下扩展其他类型的计算了。
public interface Generic<T>{
add(T a,T b);
}
//int类型的计算
public class IntGeneric impliments Generic<int>{
add(int a,int b){
return a+b;
}
}
//double类型的计算
public class IntGeneric impliments Generic<Double>{
add(double a,double b){
return a+b;
}
}