- 使用泛型的原因
Object类型可以接收任意的对象类型,但在实际使用中,会有类型转换的问题 ,因此,提供泛型解决。
2.概念
泛型即为"参数化类型",就是把类型当作参数动态传递。
泛型的好处就是在编译的时候能够检查类型安 全。
3.泛型类
通过泛型可以完成对一组类的操作对外开 放相同的接口 。
常见的泛型标识符:T(任意标识符),E,K,V等。
1.泛型的类型参数只能是类类型
2.泛型的类型参数可以有多个
3.如果没有定义具体类型,默认为Object
4.泛型类派生子类/泛型接口
若子类继承/实现父类/接口是有泛型的,则子类可定义为一个泛型类,且与父类类型一致。
public class Person<T> implements Comparable<T>{
private String name;
@Override
public int compareTo(Person o) {
return 0;
}
public static void main(String[] args) {
Person<String> p=new Person<>();
p.compareTo("a");
}
}
若子类继承/实现父类/接口是有泛型的,子类也可以不定义为泛型类,但父类/接口必须明确
public class Person implements Comparable<Person>{
private String name;
@Override
public int compareTo(Person o) {
return 0;
}
public static void main(String[] args) {
Person p=new Person();
}
}
5.泛型通配符
"?" 表示任意的类型实参
● 类型通配符上限 类/接口<?extends T>
该泛型的类型只能为T及T的子类。 ● 类型通配符下限 类/接口<?super T>
该泛型的类型只能为T及T的父类。
public class Demo<T>{
public void test(Demo<?> d){
}
public void test1(Demo<? extends T> d){
}
public void test2(Demo<? super T> d){
}
public static void main(String[] args) {
/*Demo d1=new Demo<>();
Demo<Integer> d2=new Demo<>();
Demo<String> d3=new Demo<>();
d1.test(d2);
d1.test(d3);*/
/*Demo<Number> d1=new Demo<>();
Demo<Integer> d2=new Demo<>();
Demo<Number> d3=new Demo<>();
//只能传入Number及Number的子类
d1.test1(d2);
d1.test1(d3);*/
Demo<Integer> d1=new Demo<>();
Demo<Integer> d2=new Demo<>();
Demo<Number> d3=new Demo<>();
//只能传入Tnteger及Integer的父类
d1.test2(d2);
d1.test2(d3);
}
}
6.类型擦除
泛型是Java 1.5版本才引进的概念,在这之前是没有泛型的,但是,泛型代码能够很 好地和之前版本的代码兼容。那是因为,泛到信息只存在于代码编译阶段,在进入JVM之 前,与泛型相关的信息会被擦除掉,我们称之为一类型擦除。 泛型类被类型擦除后,相应的类型就被替换成 Object 类型或者上限类
import java.lang.reflect.Field;
import java.util.ArrayList;
public class Demo2 <T>{
public T name;
public static void main(String[] args) throws NoSuchFieldException {
ArrayList<String> a=new ArrayList<>();
/*
泛型只是编译期间对类型进行限制,底层是Oject类
即泛型类型擦除
*/
a.add("");
Demo2<String> d2=new Demo2<>();
d2.name="aa";
/*
通过反射,获取运行时的状态信息,为Object类
*/
Class c=d2.getClass();
Field f=c.getField("name");
System.out.println(f.getName()+" : "+f.getType());//name : class java.lang.Object
}
}