1.关于泛型:
为什么需要泛型?
使用集合时可能发生安全的问题,可以向集合中放入任何类型。
从集合中获取元素,需要进行类型的强制转换。
2.使用泛型:使用泛型方法,泛型类
3.具体代码
public class Dao<T> {// 泛型类的声明
public void add(T t) {
}
public void update(T t) {
}
public void delete(T t) {
}
public T select(int id) {
T result = null;
return result;
}
public List<T> selectAll() {
return null;
}
public Object getProperty(int id) {
return null;
}
// 在方法的返回值前面声明类型方法<>,
public <E> E getPropertyNew(int id) { // 泛型方法的声明
return null;
}
}
public class Client {
public void saveUser() {
Dao<Person> dao = new Dao<>();
Person t = new Person();
dao.add(t);
Person p = dao.select(1);
System.out.println(p);
List<Person> personList = new ArrayList<>();
List<Student> studentList = new ArrayList<>();
printPersons1(personList);
printPersons1(studentList); //error
// The method printPersons1(List<Person>) in the type Client is not
// applicable for the arguments (List<Student>)
// 泛型通配符的应用 ? extends
printPersons2(personList);
printPersons2(studentList);
// 泛型方法
String name = (String) dao.getProperty(0);
// 返回类型不确定,用了Object ,但是要强制转化,太麻烦
String new_name = dao.getPropertyNew(0); // 不用强制转换了吧,好爽啊
}
public static void printPersons1(List<Person> persons) {
}
public static void printPersons2(List<? extends Person> persons) {
// ? extends Person
// 只要继承Person就行了
}
}
4.泛型的应用
public static void main(String[] args) {
// 泛型应用
// 1.集合-->数组
Collection<Person> persons = new ArrayList<>();
persons.add(new Person(1, "张三", 20));
persons.add(new Person(2, "李四", 21));
persons.add(new Person(3, "王五", 22));
persons.add(new Person(4, "赵六", 23));
persons.add(new Person(5, "田七", 24));
// 普通方式的遍历,还要强制转化
Object[] person = persons.toArray();
for (Object o : person) {
Person p = (Person) o;
System.out.println(p);
}
// 直接这样呢,执行会报错的 Exception in thread "main" java.lang.ClassCastException:
// [Ljava.lang.Object; cannot be cast to [Lcom.cnpc.generic.Person;
// Person[] person = (Person[]) persons.toArray();
// System.out.println(person);
// 要使用牛x方式了
Person[] personsNew = persons.toArray(new Person[0]);// 注意这种写法哦
for (Person p : personsNew)
System.out.println(p);
// 2.Map的遍历
Map<String, Person> personMap = new HashMap<>();
personMap.put("1=", new Person(1, "张三", 20));
personMap.put("2=", new Person(2, "李四", 21));
personMap.put("3=", new Person(3, "王五", 22));
personMap.put("4=", new Person(4, "赵六", 23));
personMap.put("5=", new Person(5, "田七", 24));
// 此种方式必须泛型,否则编译都出错
for (Map.Entry<String, Person> entity : personMap.entrySet()) {
String key = entity.getKey();
Person val = entity.getValue();
System.out.println(key + " - " + val);
}
}