泛型
JDK 1.5前用Object,之后才引入泛型的概念
定义
:泛型将数据类型参数化****。在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法**。
- 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)
泛型实例化
必须在类名后指明类型,相当于把“T”赋值,指定T代表的类型
注意:
1.指定泛型时不能使用基本数据类型,用包装类替代
2.静态方法中不能使用类的泛型
3.异常类不能是泛型的
4.不能在try-catch中使用泛型
泛型类
public class GenericDemo5 {
public static void main(String args[]){
Point<String> p = new Point<String>();
p.setVar("it");
System.out.println(p.getVar().length());// 2
}
}
class Point<T>{// 此处可以随便写标识符号,T是type的简称
private T var;
public T getVar(){
return var;
}
public void setVar(T var){// 设置的类型也由外部决定
this.var = var;
}
}
泛型接口
interface Info<T>{
public T getVar();
}
class InfoImpl<T> implements Info<T>{//定义泛型接口的子类
private T var;// 定义属性
public InfoImpl(T var){
this.setVar(var);
}
public void setVar(T var){
this.var = var;
}
public T getVar(){
return this.var;
}
}
public class GenericDemo6 {
public static void main(String arsg[]){
Info<String> i = null;//声明接口对象
i = new InfoImpl<String>("汤姆") ;//通过子类实例化对象
System.out.println("内容:" + i.getVar()) ;
}
}
泛型方法
方法中出现了泛型的结构。
注意:
1.泛型方法所属的类是不是泛型类都没有关系
2.泛型方法可以是静态的,因为泛型参数在调用方法时确定,并非在实例化类时确定。
为什么要使用泛型方法呢?因为泛型类要在实例化的时候就指明类型,如果想换一种类型,不得不重新new一次,可能不够灵活;而泛型方法可以在调用的时候指明类型,更加灵活。
通配符
类A是类B的父类,G<A>
和G<B>
是无关的,二者共同的父类是G<?>
?
即通配符
对于定义了通配符的对象不能继续添加数据(null除外);可以读取其中数据,类型为Object。
- 通配符指定上限 上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口,即<=
- 通配符指定下限 下限super:使用时指定的类型不能小于操作的类,即>=