一、泛型的介绍及优点
泛型的本质是参数化类型,即给类型指定一个参数,然后在使用时再指定此参数具体的值,那样这个类型就可以在使用时决定了
(1)保证了类型的安全性;(2) 消除强制转换;(3)避免了不必要的装箱、拆箱操作,提高程序的性能;(4)提高了代码的重用性。
二、如何使用泛型
1、泛型类
/** * 泛型类 * * @param <T> */ public class Generic<T> { private T key; public Generic(T key) { this.key = key; } public T getKey() { return key; } public void setKey(T key) { this.key = key; } @Override public String toString() { return "Generic{" + "key=" + key + '}'; } }
//泛型子类明确父类 public class GenericChild1 extends Generic<String>{ public GenericChild1(String key) { super(key); } } //泛型子类,和父类泛型保持一致 public class GenericChild2<T> extends Generic<T> { public GenericChild2(T key) { super(key); } }
2、泛型接口
public interface IGeneric<T> { void printObject(T t); } public class IGenericImpl<T> implements IGeneric<T> { @Override public void printObject(T t) { System.out.println(t); } } public class IGenericImpl2 implements IGeneric<String> { @Override public void printObject(String t) { System.out.println(t); } }
3、泛型方法
public <E> E getValue2(E e) { return e; } public <E> void print3(E... e) { for (E item : e) { System.out.println(item); } } public <E> void printAll(E e) { System.out.println(e); }
4、泛型通配符
public class Animal { } public class Cat extends Animal{ } public class MiniCat extends Cat{ }
三、测试
public static void main(String[] args) { Generic<String> generic=new Generic<>("zhansan"); System.out.println(generic.toString()); IGeneric<Integer> iGeneric=new IGenericImpl<>(); iGeneric.printObject(10); Integer uer = Generic.getValue(1); System.out.println(uer); String str = generic.getValue2("abc"); System.out.println(str); }
public static void main(String[] args) { List<Animal> animals=new ArrayList<>(); List<Cat> cats=new ArrayList<>(); List<MiniCat> miniCats=new ArrayList<>(); showCat(cats); showCat(miniCats); showCat2(cats); showCat2(animals); } public static void showCat(List<? extends Cat> list){ for (Cat cat : list) { System.out.println(cat); } } public static void showCat2(List<? super Cat> list){ for (Object o : list) { System.out.println(o); } }