JDK5.0新特性-泛型
泛型(重点)
什么是泛型?
对数据类型进行一个限定.
应用最多的地方是集合。
为什么要使用泛型?
1.提高我们程序安全性.
2.将运行阶段的问题在编译阶段解决.
3.不用进行类型强制转换
-----------------------------------------------
我们学习泛型的目的:会使用集合上定义的泛型。
1.集合上泛型的基本使用.
//Collection<E>
//List<E>
//Set<E>
//它们的作用是限定集合中元素的类型.
我们可不可以自己在类上或接口上定义泛型?
可以。怎样定义?
class 类名<T>{
}
在类上声明的泛型怎样使用?
类的成员:成员属性---成员方法.
成员属性:类属性(static) 实例属性(非static)---我们管实例属性就叫成员属性.
成员方法:类方法 实例方法(成员方法)
类上声明的泛型 可以应用于成员方法或成员属性上。
在类上声明的泛型不能在类的静态成员上使用?
原因:是类上声明的泛型,只有在创建对象进才能进行类型传递。
而静态成员是不需要对象就可以调用。
我们可不可以在静态的方法上声明泛型?
可以
格式
修饰符 <泛型> 返回值 方法名(){}
泛型是应用于设计阶段.
-----------------------------------------------------------------------------
在集合上应用泛型高级
通配符. ?
关于?在集合中的应用.
1. ? extends E
代表的是E类型或E的子类类型.
应用:在Collection接口中的addAll 方法
2. ? super E
代表的是E类型或E的父类类型.
应用:在TreeSet的构造方法上。
TreeSet集合:
它是一个可以排序的Set集合.
TreeSet集合怎样排序?
1.自然顺序
只要实现这个接口Comparable,就代表这个类型的元素具有自然顺序
2.比较器.
实现这个接口Comparator的类,可以根据指定条件进行比较。
指定比较器时,如果集合中的元素是按照父类中的属性进行比较,这时可以使用父类的比较顺.
------------------------------------------------------------------
泛型擦除机制
笔试题:List<String> list=new ArrayList<String>().要求向集合中添加一个Integer数值10
List<String> list = new ArrayList<String>();
// list.add(10);
List a = list;
a.add(10);
System.out.println(list);
上面操作,在笔试中不要使用,而要使用反射完成.
泛型在编译阶段有效,在运行阶段无效果。
package cn.itcast.generic; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class Demo { @Test public void fun1() { //show("abc"); // 这时show方法上的T描述的就是String //show(10); // 这时show方法上的T描述的就是Intger } // 定义两个方法. // public void show(String s) { // System.out.println(s); // } // // public void show(int i) { // System.out.println(i); // } // public <T> void show(T t) { // // System.out.println(t); // } // public void show(Object obj) { // // 使用Object来描述我们的信息,类型模糊.在使用时,还需要进行手动转型.------ClassCastException // // 类型转换异常 // System.out.println(obj); // } // 泛型应用最多的地方---集合. @Test public void fun2() { // Collection<E> // List<E> // Set<E> // 它们的作用是限定集合中元素的类型. List<String> list = new ArrayList<String>(); list.add("abc"); } // 在类上声明泛型使用 @Test public void fun3() { GenericDemo1<String> d = new GenericDemo1<String>(); // 在GenericDemo1类中的t属性它的类型是String print方法的参数与返回值也是String。 } // 做一个方法,它可以将集合中的所有元素打印. public void show(List<?> list) { System.out.println(list); } @Test public void fun4() { List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); List<Integer> list1 = new ArrayList<Integer>(); list1.add(1); list1.add(2); list1.add(3); show(list); show(list1); } }
package cn.itcast.generic; public class GenericDemo1<T> { // 类上声明一个泛型 // 成员属性 T t; // 成员方法-----返回值上应用 参数 public T print(T s) { return s; } //可不可以在静态成员上使用. //static T tt; // public static T show(){ // return null; // } //在方法上定义泛型. 定义泛型 public <K> K show(K k){ return k; } }
泛型擦除
package cn.itcast.generic; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.TreeSet; import org.junit.Test; public class Demo1 { // ? extends E @Test public void fun1() { List<Integer> list1 = new ArrayList<Integer>(); list1.add(1); list1.add(2); list1.add(3); List<Double> list2 = new ArrayList<Double>(); list2.add(1.0); list2.add(2.0); list2.add(3.0); // List<String> l=new ArrayList<String>(); List<Number> list = new ArrayList<Number>(); list.addAll(list1); // addAll(Collection<? extends E> c); E代表的是Number list.addAll(list2); // list.add(l); System.out.println(list); // 理解 Integer Double与Number的关系 } // TreeSet集合应用 // 要求:学生的按照年龄排序输出.---指定比较器 @Test public void fun2() { TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); } }); // TreeSet集合中的元素必须有顺序. ts.add(new Student(1, "tom", 20)); ts.add(new Student(4, "fox", 23)); ts.add(new Student(2, "tony", 15)); System.out.println(ts); } @Test public void fun3() { List<String> list = new ArrayList<String>(); // list.add(10); List a = list; a.add(10); System.out.println(list); } } class Person { public String name; public int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // Student类的自然顺序就是按照id排序. class Student extends Person implements Comparable<Student> { private int id; public Student(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public int getId() { return id; } public void setId(int id) { this.id = id; } @Override public int compareTo(Student o) { // return this.age-o.age; return this.id - o.id; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + "]"; } }