泛型
2016-05-26 23:34
260 查看
泛型
基本使用略。擦除
没有指定泛型,其最终在一般情况下会转换成Object。这就是泛型的擦除。如:private abstract class Father<T>{ T str; public abstract void test(); } private class Child1<T,T1> extends Father{ T1 str1; @Override public void test() { } } public void test(){ Child1<String,Intent> child1 = new Child1<>(); Object str = child1.str;//str为Object类型 Intent intent = child1.str1;//str1为Intent类型,是通过泛型指定的 }
这里在extends Father时并没有指定Father的泛型,所以其内部的str类型就被转换为Object了。而在new Child1时指定了泛型String,Intent,因此str1是Intent类型的。
泛型的擦除会发生在两个地方:1,子类实现或实现时没有为父类指定泛型;2,使用者在使用时,没有指定泛型。此时会统一使用Object对待。
继承时的泛型
父类如果定义了泛型,子类在继承或实现时,必须指定全部的泛型或者都不指定。如上面的Child1,是都没指定。都指定的示例如下:private abstract class Father<T,T1>{ T str; T1 t1; public abstract void test(); } private class Child1<T,T1> extends Father<T1,T>{//父类有泛型,并且定义了。那么子类必须也指定,因为父类的泛型来自于子类 T str1; @Override public void test() { } } public void test(){ Child1<String,Integer> child1 = new Child1<>(); //此时child1中的str为Integer类型,t1为String类型 }在定义Child1类时,父类指定了泛型,它又来自于子类,子类的泛型在定义时指定,因此Child1必须定义泛型<T,T1>——这两个名字与父类的相同,但顺序可以不一致。
在new Child1时 ,为泛型指定了具体的类型。所以Father中的T,T1都有了具体的类型。
当然,可以在继承的时候,直接为Father指定泛型,此时Child1可以不使用泛型。也就是说:父类的泛型来自于子类——除非继承或实现时直接指定,而子类的泛型来自于使用时使用者指定。不能父类需要泛型,而子类却没有指定。
注意事项
1,使用泛型定义数组时,只能用来声明,不可以用来定义。即T[] ta;是合法的,但ta = new T[3];是错误的。这也是为什么ArrayList中使用的是Object[]数组来存储其中的元素,而不是直接使用泛型数组。如下是ArrayList#get()源码:@SuppressWarnings("unchecked") @Override public E get(int index) { if (index >= size) { throwIndexOutOfBoundsException(index, size); } return (E) array[index];//其中array是Object[] }
2,泛型没有多态。但可以使用通配符?达到类似多态的效果。如:
ArrayList<Father> list = new ArrayList<Child1>();//报编译错误 ArrayList<?> list = new ArrayList<Child1><child1>();//可正常使用 </child1>
相关文章推荐
- 利用反射获取类或者方法或者字段上的注解的值
- 猿题库面试总结
- 获取当前工程路径
- java上机作业_文件的复制
- android中string.xml中%1$s、%1$d等的用法
- 定制跳转界面
- SDAU练习三1024
- Linux使用Eclipse开发C/C++环境配置
- PB编写三层及三层树的函数
- Android常见的系统设置
- c++ 引用 5.26
- openjudge8471 切割回文
- 云计算的概念和价值(Xmind思维导图)
- 调查管理系统(5)---答案的存储
- 搭建git for windows服务器(100%可以成功)【转】
- innerHTML引起IE的内存泄漏
- List集合中list.remove()返回false原因
- mysql5.6 gtid复制
- 菜鸟网络
- 1、python文件读写练习