import java.util.*;
public class test {
 void printCollection(Collection<String> c) {
  for (Object e : c) {
            System.out.println(e);
      }
 } 
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  List list=new ArrayList();
  list.add(1);
  list.add(2);
  test t=new test();
  t.printCollection(list);
 }
}这段代码可以正常运行
但是printCollection(Collection<String> c)应该接受一个Collection,Collection里应该是String类型,但我我这里传给它的list默认应该存的是Object,为啥会编译通过?
还有
Collection<String> c = new Vector ();
Collection c = new Vector<String>();
以上两句中的c中分别存什么类型的数据?

解决方案 »

  1.   

    Java里面的泛型只是一种编译约束,在运行时都只是一个普通的collection而已而如果你写List<Object> list ....这样,则编译出错,没有定义<>则只是警告
      

  2.   

    第一个问题:object在输出的时候是调用了toString()方法输出,你传list进去,list里又装了字符串,自然没问题。
    第二个问题:两个容器都装的String类型,Collection<String> c = new Vector ();这里的c是一个只能装String类型的collection,Collection c = new Vector<String>();这里的c是一个只能在Vector装String类型的collection,不知道这样说你明白不?
      

  3.   

    恩,泛型在JAVA中只是编译期有用的。
    声明为list和List<Object>在编译期的检查是不同的,尽管存的都是Object。
    List可以向上转型为父类<?>的引用,而List<Object>则只能转为父类<Object>型的。至于存的什么类型,你声明的引用是怎样的类型,那存的就是同样的类型,
    第一个是String,第二个类型信息则被擦除了
      

  4.   

      List list=new ArrayList(); 这么写,相当于  List<?> list=new ArrayList<?>(); 你没有用泛型,这里的?能匹配任何类型,所以编译可以通过,而你的void printCollection(Collection<String> c) {
      for (Object e : c) {
                System.out.println(e);
          }
     } 有刚好处理的是Object类型,所以运行没问题,如果是void printCollection(Collection<String> c) {
      for (String e : c) {
                System.out.println(e);
          }
     } 你试试看,有RuntimeException发生的
      

  5.   

    反过来说吧,原则是泛型不能向上转型。
    如果代码是
    [code=Jav]
    import java.util.*;
    public class test {
     void printCollection(Collection<Object> c) {
      for (Object e : c) {
                System.out.println(e);
          }
     } 
     /**
      * @param args
      */
     public static void main(String[] args) {
      // TODO Auto-generated method stub
      List<Integer> list=new ArrayList();
      list.add(1);
      list.add(2);
      test t=new test();
      t.printCollection(list);
     }
    }
    [/code]则编译不通过。为方便你理解,我引用李兴华的例子:
    以商场购物为例,现在假设把以上的两个对象Collection<Object>和List<Integer>分别当作商场的全部商品和个人已购买的商品信息。一个人所购买的肯定是商场中很少的一部分商品,而如果现在使用[code=Jav]
    Collection<Object>=List<Integer>;
    [/code]
    就相当于在个人已购买的商品加入了商场的全部商品,相当于个人把整个商场的商品全部买走了,这基本是不可能的,所以程序无法编译通过。
      

  6.   

    反过来说吧,原则是泛型不能向上转型。
    如果代码是
    [code=Jav] 
    import java.util.*; 
    public class test { 
    void printCollection(Collection <Object> c) { 
      for (Object e : c) { 
                System.out.println(e); 
          } 

    /** 
      * @param args 
      */ 
    public static void main(String[] args) { 
      // TODO Auto-generated method stub 
      List <Integer> list=new ArrayList(); 
      list.add(1); 
      list.add(2); 
      test t=new test(); 
      t.printCollection(list); 


    [/code]则编译不通过。为方便你理解,我引用李兴华的例子:
    以商场购物为例,现在假设把以上的两个对象Collection<Object>和List<Integer>分别当作商场的全部商品和个人已购买的商品信息。一个人所购买的肯定是商场中很少的一部分商品,而如果现在使用[code=Jav] 
    Collection <Object>=List <Integer>; 
    [/code]
    就相当于在个人已购买的商品加入了商场的全部商品,相当于个人把整个商场的商品全部买走了,这基本是不可能的,所以程序无法编译通过。