是什么
做什么
怎么做
传智博客补充材料
http://www.cnblogs.com/lwbqqyumidi/p/3837629.html
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类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似于//1中的错误。因为编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。
在如上的编码过程中,我们发现主要存在两个问题:
1.当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,该对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。
2.因此,//1处取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。(类型转化异常)
public class GenericTest {public static void main(String[] args) {
/*
List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
*/
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);
}
}
}
采用泛型写法后,在//1处想加入一个Integer类型的对象时会出现编译错误,通过List<String>,直接限定了list集合中只能含有String类型的元素,从而在//2处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。
使用泛型的还有一个好处是,不用强制类型转换了哦
1.集合中为什么没有泛型的时候需要强制类型转换
因为集合的添加 函数的参数是 object 的 所有的对象都可以添加进去 因为所有的类都是obejct的子类
因为你放进去的是object 取出来的自然也是object object 要转换成原来的类型自然要强转
2.集合使用泛型
通过List<String>,直接限定了list集合中只能含有String类型的元素
3.Java中集合框架,他们是如何存放一个对象的,他的原理是什么样子的。
a.看JDK集合类源代码
b.其实java的集合框架可以理解为数据结构,它的内容主要是栈、队列、Hash表的内容,所以java集合框架中对象的存在就是利用这些算法的原理存放的,你如果学习过《数据结构》一书
c.集合里存放的都是对象的地址 指向对象的引用变量
对象都是引用类型的,一个对象生成就会在堆内存开辟一个空间,其它的对象在包含它的时候就是只用保存该引用,当使用的时候就根据引用找到该对象在堆内存中的位置。
4.为什么强制类型转换会发生错误
向上转型和向下转型
http://www.cnblogs.com/gold-worker/archive/2012/09/26/2704717.html
一、什么是泛型
泛型即“参数化类型”,
如何理解呢?((固定)Java中有基本类型8种,复杂类型有数组,String ,还有类类型)
举例:
((固定) 访问修饰符 返回值类型 方法名(参数列表){} 访问修饰符4种:public private protect (需补充))
public int add(int a,int b){
int sum;
sum = a+b;*
return sum;
}
泛型就是那个a 例如(不合语法)
public void add( E,T){
sum = E+T;
}
形参是E,T 实参传过来是什么方法体内部就是什么类型
二、泛型的使用:接口,类,方法
三、本次发现的问题:
向上向下转型