关于继承父类时,父类也有泛型,子类的情况:
练习:
1.DAO.java
package src.com.zhang.generic.geneticExer;
import java.util.*;
public class DAO<T> {
private Map<String,T>map=new HashMap<>();
public void save(String id,T entity){
map.put(id,entity);
}
public T get(String id){
return map.get(id);
}
public void update(String id,T entity){
if (map.containsKey(id)) {
map.put(id,entity);
}
}
public List<T> list(){
//错误写法:向下转型了!
// Collection<T> values = map.values();
// return (List<T>) values;
//正确写法
List<T> list=new ArrayList<>();
Collection<T> values = map.values();
for(T v:values){
list.add(v);
}
return list;
}
public void delete(String id){
map.remove(id);
}
}
2.user.java
package src.com.zhang.generic.geneticExer;
import java.util.Objects;
public class User {
private String id;
private int age;
private String name;
public User(){
}
public User(String id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String 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;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return age == user.age && Objects.equals(id, user.id) && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(id, age, name);
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", age=" + age +
", name='" + name + '\'' +
'}';
}
}
3.DAOTest.java
package src.com.zhang.generic.geneticExer;
public class DAOTest {
public static void main(String[] args) {
DAO<User> dao=new DAO<>();
dao.save("1001",new User("111",1,"zzz"));
dao.save("1002",new User("222",2,"xxx"));
dao.update("1002",new User("333",3,"ccc"));
dao.delete("1001");
for (User user : dao.list()) {
System.out.println(user);
}
}
}
自定义泛型类:
package src.com.zhang.generic;
//习惯使用T,K,V,E定义泛型
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
* 自定义泛型类
* @param <T>
*/
public class Order <T>{
T order;
public Order() {
//创建一个泛型数组不可以直接写 T[] arr=new T[]
//而是写成下面这样
T[] arr= (T[]) new Object[10];
}
public Order(T order){
this.order=order;
}
//这里只是返回值时泛型类型,但是并不是泛型方法
public T getOrder() {
return order;
}
//泛型方法:在方法中出现了泛型参数<E>,泛型参数与类的泛型参数没有任何关系
public void setOrder(T order) {
this.order = order;
}
//静态方法不可以使用泛型
// public static void show(T s){
//
// }
//这里的E告诉参数这里的E并不是一个类,而是一个泛型
public <E> List<E> copydd(E[] arr){
ArrayList<E> list=new ArrayList<>();
return list;
}
public static <E> List<E> ee(E[] arr){
System.out.println("调用ee泛型静态方法");
List<E> list=new ArrayList<>();
return list;
}
}