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中分别存什么类型的数据?
解决方案 »
- 用RandomAccessFile类统计单词个数
- 新手请教一个窗体事件小程序。。。
- 在JAVA里处理中文的能力就那么烂?
- 救命,java生成的右键菜单,怎样去除最后面的Java Applet Window
- 救急呀
- 请问怎么用java.net.Authenticator这个类的 setDefault() 方法来 提供用户名和密码!
- 如何只得到文件的名称(包括后缀名),但不包含路径??
- Java开发精华文摘
- java网络编程高手请进!高分求教!问题解决一定给分!!!
- 大佬们,mysql装不上,好像需要什么插件。谁有啊
- 哪有老版本的jdk下载 1.3之前版本
- java基本语法疑问,new int[5];为何不合法?
第二个问题:两个容器都装的String类型,Collection<String> c = new Vector ();这里的c是一个只能装String类型的collection,Collection c = new Vector<String>();这里的c是一个只能在Vector装String类型的collection,不知道这样说你明白不?
声明为list和List<Object>在编译期的检查是不同的,尽管存的都是Object。
List可以向上转型为父类<?>的引用,而List<Object>则只能转为父类<Object>型的。至于存的什么类型,你声明的引用是怎样的类型,那存的就是同样的类型,
第一个是String,第二个类型信息则被擦除了
for (Object e : c) {
System.out.println(e);
}
} 有刚好处理的是Object类型,所以运行没问题,如果是void printCollection(Collection<String> c) {
for (String e : c) {
System.out.println(e);
}
} 你试试看,有RuntimeException发生的
如果代码是
[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]
就相当于在个人已购买的商品加入了商场的全部商品,相当于个人把整个商场的商品全部买走了,这基本是不可能的,所以程序无法编译通过。
如果代码是
[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]
就相当于在个人已购买的商品加入了商场的全部商品,相当于个人把整个商场的商品全部买走了,这基本是不可能的,所以程序无法编译通过。