1、概述
(1)泛型的目的是使数据的类型参数化
(2)定义泛型时不需要指定确定的数据类型,在真正的使用时才指定真正的类型
(3)核心目标:解决容器类型在编译时安全检查的问题
2、泛型类
(1)泛型类的基本形式
(2)泛型参数不支持基本数据类型,典型的如容器集合类不支持基本数据类型
(3)泛型中的类型在编译时就会被确定,因此在运行时是不会有泛型的信息的
package generic; public class GenericDemo{ private T member; public GenericDemo(T m){ this.member=m; } public T printAndReturn(){ System.out.println(member); return member; } //泛型类中允许普通的方法 public void sayHello(){ System.out.println("hello"); } }
package generic;
public class GenericTest {
public static void main(String[] args) {
GenericDemo integerGenericDemo=new GenericDemo(10);
integerGenericDemo.printAndReturn();
GenericDemo stringGenericDemo=new GenericDemo("hello");
integerGenericDemo.printAndReturn();
//泛型的参数虽然的参数不同,但他们是相同的类
System.out.println(integerGenericDemo.getClass());
System.out.println(stringGenericDemo.getClass());
System.out.println(stringGenericDemo.getClass()==stringGenericDemo.getClass());
}
}
10 class generic.GenericDemo class generic.GenericDemo true Process finished with exit code 0
编译后的class文件中是不包含泛型的信息的
(4)泛型类中泛型的数据类型是严格定义的,如图print函数要求传入GenericDemo
(5)通配符的使用
a、直接使用?通配符,如图所示将Number修改为?,编译器不再报错,但这种修改方法是不合理的因为如果此时传入GenericDemo
b、给泛型加入上边界,通过GenericDemo<? extends Number>来表示泛型的数据类型必须是继承自Number类型,这样既可以保证GenericDemo
c、给泛型加入下边界,GenericDemo<? super Integer>可以设置泛型的下边界,只有泛型的类型为Integer的父类,在编译器检查时才不会报错。
3、泛型接口
(1)既可以通过泛型类来实现泛型接口也可以通过具体的类来实现泛型接口
package generic; public interface GenericInterface{ public K getK(); public V getV(); }
a、泛型类实现泛型接口,表示类型的字母必须相同
package generic; public class GenericImpimplements GenericInterface { @Override public K getK() { return null; } @Override public V getV() { return null; } }
b、具体的类实现泛型接口,但此时implements后接口的类型也必须是对应的具体类型
package generic; public class GenericImpimplements GenericInterface { @Override public Integer getK() { return null; } @Override public String getV() { return null; } }
4、泛型方法
(1)泛型方法既可以定义在泛型的类和接口里,也可以定义在普通的类和接口里,下列代码中
泛型类GenricDemo
package generic; public class GenericDemo{ public T member; public GenericDemo(T m){ this.member=m; } public T printAndReturn(){ System.out.println(member); return member; } //这里定义的T可以与上面的T不同 public void printEArray(T[] array){ for (T e:array) { System.out.println(e); } } }
package generic;
public class GenericTest {
public static void main(String[] args) {
GenericDemo integerGenericDemo=new GenericDemo(10);
integerGenericDemo.printAndReturn();
String[] strings=new String[]{"aaaa","bbbb","cccc"};
integerGenericDemo.printEArray(strings);
}
}
5、泛型字母的含义
(1)E : Element,表示集合中的元素
(2)T:Type,表示java类
(3)K:Key,表示键
(4)V:Value,表示值
(3)N:number,表示数字类型,如Integer,Double等



