泛型
1、为什么要有泛型?
虽然java提供了向上转型和向上转型,有些强制的转型虽然不会被编译器发现,但是会在运行的时候暴露出来。如下图和代码。
public class Main { //类的每个单词首字母要大写 public static void main(String[] args) { Student student=new Student(); Dog dog=new Dog(); Object o1=student; Object o2=dog; Student student1=(Student) o2; System.out.println(student1); } } class Student{ String name; } class Dog{ String name; }
运行结果:
为了解决这个问题,泛型就出来了。
2、定义泛型类
注意:在定义泛型类时,一般类型名称使用T来表达,而容器的元素使用E来表示
//定义泛型类 public class OverClass_01<T> { //定义泛型变量 private T over; //定义getXXX()方法 public T getOver() { return over; } //定义setXXX()方法 public void setOver(T over) { this.over = over; } public static void main(String[] args) { //实例化一个Boole型对象 OverClass_01<Boolean> over1=new OverClass_01<>(); //实例化一个Float对象 OverClass_01<Float> over2=new OverClass_01<>(); //不需要类型转换 over1.setOver(true); over2.setOver(12.3F); Boolean b=over1.getOver(); Float f= over2.getOver(); System.out.println(b); System.out.println(f); } }
运行结果:
3、泛型的常规用法
public class ArrayClass_02<T> { private T[] array; public T[] getArray() { return array; } public void setArray(T[] array) { this.array = array; } public static void main(String[] args) { ArrayClass_02<String> a=new ArrayClass_02<>(); String[] array={"成员1","成员2","成员3","成员4","成员5"}; a.setArray(array); for (int i = 0; i < a.getArray().length; i++) { System.out.println(a.getArray()[i]); } } }
运行截图:
public class MutiOverClass <K,V>{ //定义一个集合HashMap实例 public Map<K,V> map=new HashMap<>(); public void put(K k,V v){ map.put(k, v); } public V get(K k){ return map.get(k); } public static void main(String[] args) { //创建实例对象 MutiOverClass<Integer,String> mu=new MutiOverClass<>(); //往集合添加键和值 for (int i = 0; i < 5; i++) { mu.put(i,"我是集合成员"+i); } //获取集合中键对应的值 for (int i = 0; i < mu.map.size(); i++) { System.out.println(mu.get(i)); } } }
运行截图:
public class AnyClass { public static void main(String[] args) { ArrayList<Integer> a=new ArrayList<>(); a.add(1); for (int i = 0; i < a.size(); i++) { System.out.println("获取ArrayList容器的值"+a.get(i)); } Vector<String> vector=new Vector<>(); for (int i = 0; i < 5; i++) { vector.addElement("成员"+i); } for (int i = 0; i < vector.size(); i++) { System.out.println("获取Vector容器的值"+vector.get(i)); } } }
运行截图:
4、泛型的高级用法
* class 类名称<T extends anyClass> * 解释:使用泛型限制之后,泛型类的类型都必须实现和继承了anyClass这个接口或者类。 * 无论anyClass是接口还是类,在进行限制的时候都必须使用extends关键字 * * 泛型总结: * 1、泛型的类型参数只能是类类型,不可以是简单类型。 * 2、泛型的类型的个数可以是多个 * 3、可以使用extends关键字限制泛型的类型 * 4、可以使用通配符限制泛型的类型 * */ //限制泛型的类型 public class LimitClass_04 <T extends List>{ public static void main(String[] args) { //只可以实例化已经实现List接口的类 LimitClass_04<ArrayList> l1=new LimitClass_04<>(); LimitClass_04<LinkedList> l2=new LimitClass_04<>(); } }
5、总结
1、泛型的类型只能是类类型,不可以是简单类型。 2、泛型的个数是可以有多个。 3、可以使用extends关键字限制泛型的类型。 4、可以使用通配符限制泛型的类型。