为什么要使用泛型?
引入例子
- public class GenericTest {public static void main(String[] args) {
- List list = new ArrayList();
- list.add("qqyumidi");
- list.add("corn");
- list.add(100);
- for (int i = 0; i <list.size(); i++) {
- String name = (String) list.get(i); // 1
- System.out.println("name:" + name);
- }
- }
- }
上述代码在编译器没有问题, 但在运行期间, 将会报错. 因为 List 的 add 方法的参数为 object, 如果不知道 List 类型时, 通过强转获值, 这时就会报错了. 因为编译阶段正常, 而运行时会出现 "java.lang.ClassCastException" 异常. 因此, 导致此类错误编码过程中不易发现.
在如上的编码过程中, 我们发现主要存在两个问题:
1. 将对象放入集合的时候, 集合不会记住对象的类型, 当再次从集合中取出此对象时, 改对象的编译类型变成了 Object 类型, 但运行时的类型仍然是其本身类型.
2. 因此,//1 处取出集合元素时要人为的强制转化到具体的目标类型, 且很容易出现 java.lang.ClassCastException 异常
(这个例子, 是我在一篇博客里找的我能读懂的引入泛型的例子, 可是我执行的时候报错了, 错的内容是 java:4: error: cannot find symbol, 可能是我的 jdk 版本不对, 我想把关于泛型的例子尽快整理完, 这个错就暂时先放这里了. 知道具体错的朋友, 请在评论区给我留言, 谢谢.)
怎么样才能让集合记住集合内部元素各个类型, 且能够达到只要编译时不出现问题, 运行时就不出现 java.lang.ClassCastException 异常呢? 答案就是使用泛型.
什么是泛型?
泛型, 即 "参数化类型". 一提到参数, 最熟悉的就是定义方法时有形参, 然后调用此方法时传递实参. 那么也将类型由原来的具体的类型参数化, 类似于方法中的变量参数, 类型也定义成参数形式 (称之为类型形参), 然后在使用时传入具体的类型 (类型实参)
- public class GenericTest {
- public static void main(String[] args) {
- List<String> list = new ArrayList<String>();
- list.add("qqyumidi");
- list.add("corn");
- //list.add(100); // 1 提示编译错误
- for (int i = 0; i < list.size(); i++) {
- String name = list.get(i); // 2
- System.out.println("name:" + name);
- }
- }
- }
来源: http://www.bubuko.com/infodetail-2648808.html