先回顾下集合和数组的区别:
数组长度固定不变,可以存放任意数据类型,但存放的数据类型要一致。
集合长度可变,可以存放任意引用数据类型,但存放的数据类型可以不一致。比如一个集合既可以存放String类型的数据又可以存放Integer类型数据。
泛型长度可变,可以存放任意引用数据类型,但存放的数据类型要一致。
主要有泛型类、泛型接口、泛型方法以及泛型通配符。
1、泛型类
在创建对象的时候确定泛型,指定好了后这个对象就只能装指定的数据类型了。
如果要换其他数据类型,就要重新创建该类的对象,重新指定泛型。
使用格式:修饰符 class 类名<变量名> { }
//泛型类 public class MyObject<T> { //变量名也可以用其它字母 private T t; //变量t public T getT() { return t; } public void setT(T t) { this.t = t; } } //测试类 public class Test02 { public static void main(String[] args) { //比如,创建一个String类型的对象 MyObject<String> myObject = new MyObject<>(); // 省略写法 myObject.setT("abc"); System.out.println(myObject.getT()); //abc //比如,创建一个Integer类型的对象 MyObject<Integer> myObject2 = new MyObject<Integer>(); //标准写法 myObject2.setT(123); Integer integer = myObject2.getT(); System.out.println(integer); //123 } }
-----------------------------------------------------
//泛型不能直接用于数组类型的创建 public class Collection02<E> { //private E[] e = new E[10]; //警告!不能实例化 //但是可以用Object,再强转,就能做到指定输入指定输出了 private Object[] object = new Object[10]; //定义一个Object类数组 //添加指定类型元素 public void add(E e){ object[0] = e; } public E get(){ return (E) object[0]; //强转 } } //测试类 public class Collection02Test { public static void main(String[] args) { //比如创建一个String类型的对象 Collection02<String> str= new Collection02<>(); str.add("abc"); //abc System.out.println(str.get()); //比如创建一个Integer类型的对象 Collection02<Integer> in = new Collection02<>(); in.add(123); System.out.println(in.get()); //123 } }
2、泛型接口
//泛型接口 public interface Interface01<A> { void add(A a); //定义一个方法 } --------------------------------- //实现类 //1.实现接口,同时指定泛型为String public class Interface01Test implements Interface01<String> { @Override public void add(String s) { } } /* //2.实现接口,但不指定泛型,实现类就会变成泛型类 public class Interface01Test<A> implements Interface01<A> { @Override public void add(A a) { } } */
3、