什么是泛型
泛型的本质是参数化类型,操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。使用泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
栗子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| public class TestMain {
public static void main(String[] args){ TestList testList = new TestList(); testList.add("aaa"); testList.add(100); Integer num = (Integer)testList.getObj(1); ArrayList<String> list = new ArrayList<>(10); list.add(String.valueOf(100));
} }
* 简易版list */ class TestList{ private Object[] value =new Object[10]; private int size; public TestList(){
}
public void add(Object obj){ value[size] = obj; size++; }
public Object getObj(int index){ return value[index]; } }
|
向上/向下强制转型
Level1是接口,Level2实现了Level1,Level3继承自Level2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| public class TestMain {
public static void main(String[] args){
TestList<Level2> testList = new TestList(); Level2 level2 = new Level2(); Level3 level3 = new Level3(); testList.add(level2); testList.add(level3);
TestMain testMain = new TestMain(); testMain.test2(testList);
TestList<Level3> test3 = new TestList(); testMain.test(test3); }
public <T extends Level3> void test(TestList<T> list){ Level3 l = list.getObj(0); l.showMsg(); } public void test2(TestList<? extends Level2> list){ Level2 l = list.getObj(0); l.showMsg(); } }
* 简易版list * 向下转型,表示类必须是Level的子类 * 向上转型,<? super Double> */ class TestList<T>{ private Object[] value =new Object[10]; private int size;
public void add(T obj){ value[size] = obj; size++; }
public T getObj(int index){ return (T)value[index]; } }
|
总结