package com.xiaofan.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class GenericTest { /** * 方法上声明泛型 */ public <T> List<T> p(T t) { System.out.println(t); List<T> list = new ArrayList<T>(); return list; } /** * 方法上声明泛型,测试 */ @Test public void demo2() { List<String> list1 = p("abc"); List<Integer> list2 = p(100); List<ArrayList> list3 = p(new ArrayList()); } /** * 测试类上面声明泛型 */ @Test public void demo3(){ GenericDao<String> genericDao = new GenericDao<String>(); genericDao.save("aaa"); String id = genericDao.getId(0); GenericDao<Integer> genericDao2 = new GenericDao<Integer>(); genericDao2.save(100); int id2 = genericDao2.getId(0); // 阅读ArrayList 和 HashMap 源码 ctrl+ shift+T } } /** * 类上面声明泛型 */ class GenericDao<T> { private T field1; public void save(T obj) { } public T getId(int id) { return field1; } }
泛型的上限,下限,通配符
package com.xiaofan.test; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class GenericTest3 { public void print(List<?> list) { for (int i = 0; i < list.size(); i++) { Object value = list.get(i); System.out.println(list.get(i)); } } @Test public void demo1() { List<String> list1 = null; List<Integer> list2 = null; print(list1); print(list2); List<Number> list3 = new ArrayList<Number>(); add(list3); List<Byte> list4 = new ArrayList<Byte>(); add(list4); } public void add(List<? extends Number> list) { // list.add(100); Number a = list.get(0); } public void add2(List<? super Integer> list) { list.add(100); } }