泛型初步
泛型能更早的发现错误,如类型转换错误,通常在运行期才会发现,如果使用泛型,那么在编译期将会发现,通常错误发现的越早,越容易调试,越容易减少成本。(泛型与包装类型一样都是编译阶段触发)
为什么可以引入泛型?
- 可以统一集合中的数据类型。
- 可以减少将之类型的转换。
泛型的优缺点?
- 优点:统一类型,减少强制类型转换。
- 缺点:类型太统一。
以下程序若没有使用泛型,有什么缺点?
- 如果集合不使用泛型,则集合中的元素不统一,在大量集合遍历时候,只可以拿出Object类型,
- 需要做大量的强制类型转换,太麻烦。
- 示例代码01:
public static void main(String[] args) { // 创建一个集合使用泛型 SortedSet<Manager> s = new TreeSet<Manager>(); Manager m1 = new Manager("JACK",2000); Manager m2 = new Manager("MAkEE",4080); Manager m3 = new Manager("ARRAY",8090); s.add(m1); s.add(m2); s.add(m3); // 创建一个迭代器使用泛型,并遍历集合内的数据 Iterator<Manager> i = s.iterator(); while (i.hasNext()) { System.out.println(i.next()); } } class Manager implements Comparable<Manager> { @Override public int compareTo(Manager o) { int wage1 = this.wage; int wage2 = o.getWage(); if (wage1>wage2) { return 1; }else if (wage1<wage2) { return -1; } return 0; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Manager manager = (Manager) o; return wage == manager.wage && Objects.equals(name, manager.name); } @Override public int hashCode() { return Objects.hash(name, wage); } // 姓名 private String name; // 工资 private int wage; public Manager(String name, int wage) { this.name = name; this.wage = wage; } @Override public String toString() { return "Manager{" + "name='" + name + '\'' + ", wage=" + wage + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getWage() { return wage; } public void setWage(int wage) { this.wage = wage; } }
自定义泛型
以下程序因为Test类中规定只能传入相同数据类型,当测试类String类型出入则后期不可以传入其他数据类型.这样可以规范数据类的统一,方便同时调用。
示例代码02:
public class GenericTest02 { public static void main(String[] args) { // 自定义泛型 Test<String> t = new Test<String>(); t.m1("111"); } } class Test<T> { public void m1(T t) { System.out.println(t); } }