第七天泛型


 

泛型

自定义泛型

public class Student<E> {   //泛型父类
?
   String name = "123";
   E age;
?
   public Student(){}
?
?
   public Student(String name,E age){
       this.name = name;
       this.age = age;
  }
?
   public void setName(String name) {
       this.name = name;
  }
?
   public void setAge(E age) {
       this.age = age;
  }
}
?
public class Son extends Student<Integer>{ //子类继承时指明父类的泛型
?
   String name;
   String age;
?
   public Son(){}
?
   public Son(String name,String age){
       this.name = name;
       this.age = age;
  }
}
?
   public static void main(String[] args) {
       //如果定义了泛型类,实例化没指名泛型类型则默认是Object类
       //要求:如果定义了泛型类,那么建议在实例化时指明类的泛型
       Student s1 = new Student();
       s1.setAge("ABC");
       s1.setAge(123);
       //建议:实例化时指明泛型类类型
       Student<Integer> s2 = new Student<>("任",21);
?
       Son son = new Son();
       //子类在继承泛型父类是指明了父类泛型,实例化子类对象时不需再添加泛型
       son.setAge(123);    //已经默认是Integer了
?
?
  }

泛型方法

  • 在方法中出现了泛型的结构,泛型参数与类的泛型参数没有任何关系

  • 泛型方法所属的类是不是泛型类没有关系

  • 泛型方法可以声明为静态的,原因:泛型参数是在调用方法时确定的,并非在实例化类时确定。

    public <E> List<E> copy(E[] arr){
       List<E> list = new ArrayList<>();
       for(E e: arr){
           list.add(e);
      }
       return list;
  }
       Son son1 = new Son();
       Integer[] integer = new Integer[]{1,5,3,4};
       List<Integer> list = son1.copy(integer);
       System.out.println(list);
?

泛型在继承中的体现

        Object obj = null;
       String str = null;
       obj = str;
?
       Object[] obj1 = null;
       String[] str1 = null;
       obj1 = str1;
?
       List<Object> list1= null;
       List<String> list2 = null;
?
       //此时的list1和list2不具有子父类关系
       list1 = list2;  //编译报错

通配符的使用

    public static void main(String[] args) {
?
      List list1= null;
      List list2 = null;
?
      List<?> list = null;
      list = list1;
      list = list2;
?
      print(list1);
      print(list2);
?
      List list3 = new ArrayList<>();
      list3.add("AA");
      list3.add("BB");
      list3.add("CC");
      list = list3;
      //对于List<?>就不能往里面添加数据了
      //除了添加null之外
//     list.add("AA");
      //读取
      Object o = list.get(0);
      System.out.println(o); //AA
       
      System.out.println(list); //[AA, BB, CC]
?
?
  }
  public static void print(List<?> list){
      Iterator<?> iterator = list.iterator();
      while (iterator.hasNext()){
          Object obj = iterator;
          System.out.println(obj);
      }
  }
}

有条件限制的通配符的使用

    public static void main(String[] args) {
?
       List<? extends Student> list1 = null;
       List<? super Student> list2 = null;
?
       List<Student> list3 = new ArrayList<>();
       List<Son> list4 = new ArrayList<>();
       List<Person> list5 = new ArrayList<>();
?
?
?
       //编译报错
//     list1 = list5;
       Student s = list1.get(0);
       Object obj = list1.get(0);
       //编译报错
//     Son son = list1.get(0);
?
       list2 = list3;
       Object o = list2.get(0);
       //编译报错
//     Person person = list2.get(0);
?
?
       /*
       *没有下限无法往list1里面写入数据
       *因为他的继承是[Student,-无穷],所以类可能会很小
       * 比Son还小,再因为父类无法往子类中写入数据
       * 所以Son,Student,Person都无法比他们还小的
       * 类中写入数据.
       */
//     list1.add(new Student());
//     list1.add(new Person());
//     list1.add(new Son());
?
?
       /*
       *而这里的范围是[+无穷,Student]
       *所以只要写入的数据小于等于Student就能成功写入
       */
       list2.add(new Student());
       list2.add(new Son());
       //编译报错
//     list2.add(new Person());
?
?
  }
}

泛型练习题

package com.Map.Test;
?
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
?
public class DAO<T> {
?
   private Map<String,T> map;
?
   public DAO(){}
?
   public DAO(Map<String,T> map){
       this.map = map;
  }
?
   public void save(String id,T entity){
       map.put(id, entity);
  }
?
   public T get(String id){
       T t = map.get(id);
       return t;
  }
?
   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> colle = map.values();
       for (T value : colle) {
           list.add(value);
      }
   return list;
  }
?
   public void delete(String id){
       map.remove(id);
  }
?
   public Map<String, T> getMap() {
       return map;
  }
?
   public void setMap(Map<String, T> map) {
       this.map = map;
  }
}
?
?
package com.Map.Test;
?
import java.util.Objects;
?
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;
  }
?
   @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;
       return id == user.id && age == user.age && Objects.equals(name, user.name);
  }
?
   @Override
   public int hashCode() {
       return Objects.hash(id, age, name);
  }
}
?
package com.Map.Test;
?
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
?
public class Application {
   public static void main(String[] args) {
?
       HashMap<String, User> map = new HashMap<>();
       DAO<User> dao = new DAO<>(map);
?
       dao.save("1001",new User(1001,20,"林青霞"));
       dao.save("1002",new User(1002,25,"张曼玉"));
       dao.save("1003",new User(1003,24,"王祖贤"));
?
       dao.update("1003",new User(1003,22,"柳岩"));
       dao.delete("1002");
?
       List<User> list = new ArrayList<>();
       list = dao.list();
       list.forEach(System.out::println);
?
  }
?
?
}