//泛型在List中的使用
@Test
public void test1(){//举例:将学生成绩保存在ArrayList中//标准写法://ArrayList list = new ArrayList();//jdk7的新特性:类型推断ArrayList list = new ArrayList<>();list.add(56); //自动装箱list.add(76);list.add(88);list.add(89);//当添加非Integer类型数据时,编译不通过//list.add("Tom");//编译报错Iterator iterator = list.iterator();while(iterator.hasNext()){//不需要强转,直接可以获取添加时的元素的数据类型Integer score = iterator.next();System.out.println(score);}
}
package com.atguigu.generic;import java.util.Comparator;class CircleComparator implements Comparator{@Overridepublic int compare(Object o1, Object o2) {//强制类型转换Circle c1 = (Circle) o1;Circle c2 = (Circle) o2;return Double.compare(c1.getRadius(), c2.getRadius());}
}
//测试:
public class TestNoGeneric {public static void main(String[] args) {CircleComparator com = new CircleComparator();System.out.println(com.compare(new Circle(1), new Circle(2)));System.out.println(com.compare("圆1", "圆2"));//运行时异常:ClassCastException}
}
使用泛型之后:
package com.atguigu.generic;import java.util.Comparator;class CircleComparator1 implements Comparator {@Overridepublic int compare(Circle o1, Circle o2) {//不再需要强制类型转换,代码更简洁return Double.compare(o1.getRadius(), o2.getRadius());}
}//测试类
public class TestHasGeneric {public static void main(String[] args) {CircleComparator1 com = new CircleComparator1();System.out.println(com.compare(new Circle(1), new Circle(2)));//System.out.println(com.compare("圆1", "圆2"));//编译错误,因为"圆1", "圆2"不是Circle类型,是String类型,编译器提前报错,//而不是冒着风险在运行时再报错。}
}
【修饰符】 class 类名<类型变量列表> 【extends 父类】 【implements 接口们】{}
【修饰符】 interface 接口名<类型变量列表> 【implements 接口们】{}//例如:
public class ArrayList
public interface Map{....
}
声明方法时,在【修饰符】与返回值类型之间声明类型变量,我们把声明了类型变量的方法,称为泛型方法。
[修饰符] <类型变量列表> 返回值类型 方法名([形参列表])[throws 异常列表]{//...
}//例如:java.util.Arrays类中的
public static List asList(T... a){....
}
package com.atguigu.genericclass.define;class Student{private String name;private T score;public Student() {super();}public Student(String name, T score) {super();this.name = name;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public T getScore() {return score;}public void setScore(T score) {this.score = score;}@Overridepublic String toString() {return "姓名:" + name + ", 成绩:" + score;}
}public class TestStudent {public static void main(String[] args) {//语文老师使用时:Student stu1 = new Student("张三", "良好");//数学老师使用时://Student stu2 = new Student("张三", 90.5);//错误,必须是引用数据类型Student stu2 = new Student("张三", 90.5);//英语老师使用时:Student stu3 = new Student("张三", 'C');//错误的指定//Student
练习2:
定义个泛型类 DAO,在其中定义一个Map 成员变量,Map 的键为 String 类型,值为 T 类型。分别创建以下方法:
public void save(String id,T entity): 保存 T 类型的对象到 Map 成员变量中
public T get(String id):从 map 中获取 id 对应的对象
public void update(String id,T entity):替换 map 中key为id的内容,改为 entity 对象
public List list():返回 map 中存放的所有 T 对象
public void delete(String id):删除指定 id 对象定义一个 User 类:
该类包含:private成员变量(int类型) id,age;(String 类型)name。定义一个测试类:
创建 DAO 类的对象, 分别调用其 save、get、update、list、delete 方法来操作 User 对象,
使用 Junit 单元测试类进行测试。
代码实现:
/*** @author 尚硅谷-宋红康* @create 8:45*/
public class DAO {private Map map ;{map = new HashMap();}//保存 T 类型的对象到 Map 成员变量中public void save(String id,T entity){if(!map.containsKey(id)){map.put(id,entity);}}//从 map 中获取 id 对应的对象public T get(String id){return map.get(id);}//替换 map 中key为id的内容,改为 entity 对象public void update(String id,T entity){if(map.containsKey(id)){map.put(id,entity);}}//返回 map 中存放的所有 T 对象public List list(){//错误的:
// Collection values = map.values();
// System.out.println(values.getClass());
// return (List) values;//正确的方式1:
// ArrayList list = new ArrayList<>();
// Collection values = map.values();
// list.addAll(values);
// return list;//正确的方式2:Collection values = map.values();ArrayList list = new ArrayList<>(values);return list;}//删除指定 id 对象public void delete(String id){map.remove(id);}
}
package com.atguigu02.selfdefine.exer1;import java.util.Objects;/*** 定义一个 User 类:* 该类包含:private成员变量(int类型) id,age;(String 类型)name。** @author 尚硅谷-宋红康* @create 9:02*/
public class User {private int id;private int age;private String name;public User() {}public User(int id, int age, String name) {this.id = id;this.age = age;this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"id=" + id +", age=" + age +", name='" + name + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return id == user.id && age == user.age && Objects.equals(name, user.name);}@Overridepublic int hashCode() {return Objects.hash(id, age, name);}
}
package com.atguigu02.selfdefine.exer1;import java.util.List;/*** @author 尚硅谷-宋红康* @create 9:04*/
public class DAOTest {public static void main(String[] args) {DAO dao = new DAO<>();dao.save("1001",new User(1,34,"曹操"));dao.save("1002",new User(2,33,"刘备"));dao.save("1003",new User(3,24,"孙权"));dao.update("1002",new User(2,23,"刘禅"));dao.delete("1003");List list = dao.list();for(User u : list){System.out.println(u);}}
}
public class DAO {public E get(int id, E e) {E result = null;return result;}
}
举例2:
public static void fromArrayToCollection(T[] a, Collection c) {for (T o : a) {c.add(o);}
}public static void main(String[] args) {Object[] ao = new Object[100];Collection
class Creature{}
class Person extends Creature{}
class Man extends Person{}class PersonTest {public static void test(T t){System.out.println(t);}public static void main(String[] args) {test(new Person());test(new Man());//The method test(T) in the type PersonTest is not //applicable for the arguments (Creature)test(new Creature());}
}
举例2:
public static void main(String[] args) {Collection list1 = new ArrayList();Collection list2 = new ArrayList();Collection list3 = new ArrayList();Collection list4 = new ArrayList();getElement1(list1);getElement1(list2);//报错getElement1(list3);getElement1(list4);//报错getElement2(list1);//报错getElement2(list2);//报错getElement2(list3);getElement2(list4);}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection super Number> coll){}
举例3:
public static void printCollection1(Collection extends Person> coll) {//Iterator只能用Iterator>或Iterator extends Person>.why?Iterator> iterator = coll.iterator();while (iterator.hasNext()) {Person per = iterator.next();System.out.println(per);}
}public static void printCollection2(Collection super Person> coll) {//Iterator只能用Iterator>或Iterator super Person>.why?Iterator> iterator = coll.iterator();while (iterator.hasNext()) {Object obj = iterator.next();System.out.println(obj);}
}