Java开发实战经典里P498有这段代码:import java.util.ArrayList ;
import java.util.List ;
public class ArrayListDemo04{
public static void main(String args[]){
List<String> allList = null ;
allList = new ArrayList<String>() ; // 指定操作的泛型为String
allList.add("Hello") ; // 此方法由Collection接口而来
allList.add(0,"World") ; // 在第一个位置上添加新的内容
allList.add("MLDN") ; // 向Collection中加入内容
allList.add("www.mldn.cn") ;
String str[] = allList.toArray(new String[]{}) ; // 指定好类型
System.out.print("指定数组类型:") ;
for(int i=0;i<str.length;i++){
System.out.print(str[i] + "、") ;
}
System.out.print("\n返回对象数组:") ;
Object obj [] = allList.toArray() ; // 返回Object类型
for(int i=0;i<obj.length;i++){
String temp = (String)obj[i] ; // 进行向下转型
System.out.print(temp + "、") ;
}
}
};划横线加粗的语句【String temp = (String)obj[i] ;】这句代码是向下转型,请问向下转型前是否必须向上转型,如果需要,这句代码的向上转型在哪?

解决方案 »

  1.   

    我认为向上转型是必需的,否则会报ClassCastException的异常。英文可以参考:http://stackoverflow.com/a/23414798/3643591,中文可以参考:http://blog.csdn.net/sheepmu/article/details/38327205。
    这里做向上转型的就是“Object obj [] = allList.toArray() ;”这句,是将String类型转型为Object。
      

  2.   

    不懂向下或向上转型,但是知道:String是object的一个子类,java代码:Object obj [] = allList.toArray();是把一个所有元素都是String类型的List集合转化成一个所有元素都是Object类型的数组集合,是使用子类String转换成父类Object,虽然转换后的元素都是Object类型的,但是它们仍然保留String类型的特性,只是不能使用,java代码:String temp = (String)obj[i];又把父类还原成子类,子类的特性就可以使用了
      

  3.   

    也就是说
    Object obj [] = allList.toArray() 相当于
    Object obj0 = allList.get(0);
    Object obj1 = allList.get(1);
    Object obj2 = allList.get(2);
    ..........................
    Object obj[] = {obj0,obj1,obj2,.......};
    源代码中allList.toArray()  的内部完成了向上转型。谢谢大家。
      

  4.   

    Object obj [] = allList.toArray() ; // 返回Object类型
    我觉得这句话返回的肯定是String[]类型。只是接收它的是父类对象。父类对象对于子类是照单全收,只是抽象的“向上转型”,其实没做任何操作。如果你通过父类对象调子类的方法,JVM不知道你要调谁的方法,所以必须向下转型。具体还是要反编译看源码如有错误,还请批评指正!
      

  5.   

    如果需要这么考虑的话,那么前一句话,就是完成了向上转型。Object obj [] = allList.toArray()
    这句话里,其实返回的是string 类型,但是把他们向上转型成了  obj。