1. 泛型的作用
- JDK1.5之前只能把元素类型设计为Object,JDK1.5后使用泛型来解决。把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection、List、这个就是类型参数,即泛型
2. 集合中使用泛型
public class GenericTest {
@Test
public void test1() {
ArrayList list = new ArrayList();
list.add(78);
list.add(79);
list.add(75);
list.add(70);
list.add("Tom");
for (Object o : list) {
int score = (int) o;
System.out.println(score);
}
}
@Test
public void test2() {
ArrayList<Integer> list = new ArrayList<>();
list.add(123);
list.add(321);
list.add(122);
for (Integer i : list) {
int score = i;
System.out.println(score);
}
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
iterator.next();
}
}
}
3. 自定义泛型结构
public class Order<T> {
String orderName;
int orderId;
T orderT;
public Order(String orderName, int orderId, T orderT) {
this.orderName = orderName;
this.orderId = orderId;
this.orderT = orderT;
}
public T getOrderT() {
return orderT;
}
public void setOrderT(T orderT) {
this.orderT = orderT;
}
public <E> List<E> copyFromArrayToList(E[] arr) {
ArrayList<E> list = new ArrayList<>();
for (E e : arr) {
list.add(e);
}
return list;
}
}
public class GenericTest1 {
@Test
public void test1() {
Order order = new Order();
order.setOrderT(123);
Order<String> stringOrder = new Order<>("AA", 1001, "orderAA");
stringOrder.setOrderT("hello");
SubOrder subOrder = new SubOrder();
subOrder.setOrderT(1122);
SubOrder1<String> subOrder1 = new SubOrder1<>();
subOrder1.setOrderT("BB");
ArrayList<String> list1 = null;
ArrayList<Integer> list = new ArrayList<>();
}
}
4. 通配符的使用
public class GenericTest2 {
@Test
public void test1() {
List<Object> list1 = null;
List<String> list2 = null;
List<?> list = null;
list = list1;
list = list2;
print(list1);
print(list2);
List<String> list3 = new ArrayList<>();
list3.add("AA");
list3.add("BB");
list = list3;
list.add(null);
Object o = list.get(0);
System.out.println(o);
}
public void print(List<?> list) {
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
}
@Test
public void test2() {
List<? extends Order> list1 = null;
List<? super Order> list2 = null;
List<SubOrder> list3 = null;
List<Order> list4 = null;
List<Object> list5 = null;
list1 = list3;
list1 = list4;
}
}
5. 具体使用
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() {
List<T> list = new ArrayList<>();
Collection<T> values = map.values();
for (T t : values) {
list.add(t);
}
return list;
}
public void delete(String id) {
map.remove(id);
}
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", age=" + age +
", 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;
if (id != user.id) return false;
if (age != user.age) return false;
return name != null ? name.equals(user.name) : user.name == null;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + age;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
}
public class DAOTest {
public static void main(String[] args) {
DAO<User> userDAO = new DAO<User>();
userDAO.save("1001", new User(1001, 32, "zhou"));
userDAO.update("1001", new User(1001, 23, "zou"));
List<User> list = userDAO.list();
list.forEach(System.out::println);
}
}