目录
含义:集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象。所以在jdk1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此,此时把元素类型设计成一个参数,这个类型参数叫做泛型。
泛型形式:<类型>
- public class Tset6 {
- public static void main(String[] args) {
- Object o = new Object();
- String s = new String();
- o=s;//多态的一种形式
-
- Object[] objects = new Object[10];
- String[] strings = new String[10];
- objects=strings;//多态的一种形式
-
- ArrayList<Object> l1 = new ArrayList<>();
- ArrayList<String> l2 = new ArrayList<>();
- //l1=l2;报错
- //因为l1,l2底层都是Object类型的数组,而这个泛型仅仅是对我们写代码时进行限制,所以l1和l2本质上完全没继承关系,全是Object类型
- }
- }
- //普通类
- public class GenericTest {}
- //泛型类
- public class GenericTest<A> {}
- //泛型类
- public class GenericTest
{ - int age;
- String name;
- E sex;
- public void method1(E n){
- System.out.println(n);
- }
- public void method2(E[] m){
- System.out.println(Arrays.toString(m));
- }
- }
- class Test{
- public static void main(String[] args) {
- //实例化时不指定泛型默认为Object
- GenericTest gt1 = new GenericTest();
- gt1.method1("hello");
- gt1.method1(17);
- gt1.method2(new String[]{"a","b","c"});
- gt1.method2(new Integer[]{1,2,3});
- //实例化的时候指定泛型
- GenericTest<String> gt2 = new GenericTest<>();
- gt2.method1("必须是string了,我失去了自由");
- gt2.sex="男";//因为上面已经指定了泛型为string,因此sex为string类型
- }
- }
父类指定泛型,子类可以直接使用父类方法属性等
- //泛型类
- public class GenericTest<E> {
- int age;
- String name;
- E sex;
- public void method1(E n){
- System.out.println(n);
- }
- public void method2(E[] m){
- System.out.println(Arrays.toString(m));
- }
- }
- class SubGenericTest extends GenericTest<Integer>{}
- class Test{
- public static void main(String[] args) {
- //父类指定泛型,子类可以直接使用
- SubGenericTest sgt1 = new SubGenericTest();
- sgt1.method1(12);//这里父类指定泛型了,因此必须传Integer类型
- }
- }
父类不指定泛型,那么子类直接变成一个泛型类,这个泛型类型可以在子类创建对象时确定
- public class GenericTest
{ - int age;
- String name;
- E sex;
- public void method1(E n){
- System.out.println(n);
- }
- public void method2(E[] m){
- System.out.println(Arrays.toString(m));
- }
- }
- class SubGenericTest
extends GenericTest{} - class Test{
- public static void main(String[] args) {
- SubGenericTest<String> sgt1 = new SubGenericTest();
- sgt1.method1("hello");
- }
- }
- public class GenericTest1<A,B,C> {
- A age;
- B name;
- C sex;
- public void method(A m,B n,C x){
- System.out.println(m);
- System.out.println(n);
- System.out.println(x);
- }
- //泛型类的构造器不写泛型类型
- public GenericTest1(){}
- }
- public class GenericTest2
{ - //不是泛型方法
- public void method1(E e){}
- //是泛型方法
- public
void method2(T t){} - public
void method3(T t,U u){} - }
泛型方法的要求:这个方法的泛型的参数类型要和当前类的泛型无关。
注意:泛型方法定义的时候需要在返回值类型前面加上
- public class GenericTest2
{ - //不是泛型方法
- public void method1(E e){}
- //是泛型方法
- public
void method2(T t){} - public static
void method3(T t,U u){} - }
- class Test5{
- public static void main(String[] args) {
- GenericTest2<Object> gt2 = new GenericTest2<>();
- gt2.method2("hello");//调用方法时确定泛型方法为字符串类型
- gt2.method2(12);//调用方法时确定泛型方法为Integer类型
- gt2.method3("hello", true);//调用方法时分别确定了2个泛型
- }
- }
泛型通配符写法:>
- public class Test7 {
- public static void main(String[] args) {
- ArrayList<Object> objects = new ArrayList<>();
- ArrayList<String> strings = new ArrayList<>();
- ArrayList<Integer> integers = new ArrayList<>();
- List> list=null;
- list=objects;
- list=strings;
- list=integers;
- }
- }
- public void method3(List> list){
- //遍历
- for (Object a:list){
- System.out.println(a);
- }
- //数据的写入操作
- //list.add("abc");报错,因为什么类型都可能接收到,接收到的类型若不是String类型的泛型就没意义了
- list.add(null);//可行,但没意义
- //数据的读取操作
- Object o = list.get(0);
- System.out.println(o);
- }
- public class Person extends Object{}
- class Student extends Person{}
- class Test8{
- public static void main(String[] args) {
- //下面3个集合不具备子类父类的关系
- ArrayList<Object> objects = new ArrayList<>();
- ArrayList<Person> persons = new ArrayList<>();
- ArrayList<Student> students = new ArrayList<>();
-
- //泛型的上限
- //List extends Person>是List
的父类,也是List的父类 - List extends Person> list1=null;
- //list1=objects;报错
- list1=persons;
- list1=students;
-
- //泛型的下限
- //List super Person>是List
的父类,也是List的父类 - List super Person> list2=null;
- list2=objects;
- list2=persons;
- //list2=students;报错
- }
- }