一、泛型(JDK1.5的一个新特性) 泛泛的类型,不确定 的类型,可以用应用于不同的类、接口、方法等。
格式 :
<E>
(E)只是一个类型符号,本质是一个变量,等待接收的是一种数据类型。
1.使用泛型的好处 :
将运行时期的ClassCastException转换为编译时期的编译错误。
避免类型强转的麻烦。
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import java.util.ArrayList; public class Main { public static void main(String[] args) { demo01(); demo02(); } //不使用泛型(不写<E>) public static void demo01() { ArrayList names=new ArrayList(); names.add(123); names.add(true); names.add("asd"); for(Object i:names) { String s=(String)i; //强制类型转换 System.out.println(s); } } //使用泛型 public static void demo02() { ArrayList<String> names=new ArrayList<String>(); //使用泛型进行创建 names.add("123"); names.add("asded0"); names.add("asd"); for(String i:names) { System.out.println(i); } } }
代码结果分析: 执行demo01()方法:不使用泛型的话,编译时期没有错误,但是执行就会报错。 Exception in thread “main” java.lang.ClassCastException : java.lang.Integer cannot be cast to java.lang.String at Main.demo01(Main.java:17) at Main.main(Main.java:4)
执行demo02()方法:使用泛型()的话,可以将其转换到编译时期出错。 123 asded0 asd
扩展: 可以使用迭代器 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import java.util.*; public class Main { public static void main(String[] args) { demo01(); } //使用迭代器 public static void demo01() { ArrayList<String> names=new ArrayList<String>(); //定义names对象 names.add("123"); //使用add方法 names.add("asded0"); names.add("asd"); Iterator<String> s=names.iterator(); //对象生成迭代器 while(s.hasNext()) //判断是否由下一个 { String a=s.next(); //当前位置的值传给a System.out.println(a); //输出a然后指针自动后移下一个 } } }
二、泛型类 格式: ** public class 类名<E>
** 注:当你创建类对象的时候,会确定对应的E是那个类型,增加了你的多项选择!
举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public class Main { public static void main(String[] args) { //创建一个Person Person p=new Person(); p.setAaa("123"); //报错(只有int可以) } } public class Person{ E aaa; public int getAaa() { return aaa; } public int setAaa(int aaa) { this.aaa = aaa; } }
如果这样,p。setAaa方法会报错,因为set方法要返回的是int型,而我定义的p对象调用方法给的是String类型的,会报错。
使用泛型类: 1. Person后面加一个<E>
2. 然后将set和get方法返回值都改为E
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class Main { public static void main(String[] args) { //创建一个Person Person p=new Person(); p.setAaa("123"); //创建一个Person<E> Person<String> pp=new Person<String>; pp.setAaa("ASD"); //可以设置String的 //创建一个Person<E> Person<Integer> pp=new Person<Integer>; pp.setAaa(123); /可以设置int的 } } public class Person<E>{ E aaa; public E getAaa() { return aaa; } public void setAaa(E aaa) { this.aaa = aaa; } }
三、泛型方法(少用) 格式: ** public <T>
返回值类型 方法名(T t); ** 注:当你调用方法,传递参数的时候确定。
1 2 3 4 5 6 7 8 //Main方法调用 Person<String> pp2=new Person<String>(); pp2.show("asd"); //Person类里面的一个泛型方法: public <T> void show(T t) { System.out.println(t); }
四、泛型接口 格式: ** public interface 接口名 <E>
**
当子类实现接口时候,确定接口的泛型。
当子类实现接口时候,还是不确定泛型,把接口的泛型继续实现下来(就跟抽象类一样,如果实现类没有覆盖重写所有的抽象方法,那么继续让它的实现类实现)
<
集合2
蓝桥杯
>