JAVA泛型中的实际类型参数两边个代表什么意思?具体的含义。
打个比方(以下这个程序会报错!):List<String>list1=newArrayList();list1.add(123);list1.add("cccc");li...
打个比方(以下这个程序会报错!):
List<String> list1=new ArrayList();
list1.add(123);
list1.add("cccc");
list1.add("cc11");
for (int i = 0; i <list1.size(); i++) {
System.out.println(list1.size());
}
以下这个程序是不会报错的:
List list1=new ArrayList<String>();
list1.add("cccc");
list1.add("cc11");
list1.add(123);
for (int i = 0; i <list1.size(); i++) {
System.out.println(list1.get(i));
}
可是,等号两边可以只有一边写实际的类型参数。
但是造成的结果却又不同。
所以,我想请教,等号两边的实际的类型参数分别代表着什么意思。
或者是说,为什么会造成不同的结果。
(我是初学者。。。 展开
List<String> list1=new ArrayList();
list1.add(123);
list1.add("cccc");
list1.add("cc11");
for (int i = 0; i <list1.size(); i++) {
System.out.println(list1.size());
}
以下这个程序是不会报错的:
List list1=new ArrayList<String>();
list1.add("cccc");
list1.add("cc11");
list1.add(123);
for (int i = 0; i <list1.size(); i++) {
System.out.println(list1.get(i));
}
可是,等号两边可以只有一边写实际的类型参数。
但是造成的结果却又不同。
所以,我想请教,等号两边的实际的类型参数分别代表着什么意思。
或者是说,为什么会造成不同的结果。
(我是初学者。。。 展开
3个回答
展开全部
List<String> list1=new ArrayList();
list1.add(123);
list1.add("cccc");
list1.add("cc11");
for (int i = 0; i <list1.size(); i++) {
System.out.println(list1.size());
}
这个是代表你的这个list类型是String 类型,但是你所new的类型不确定,你应该这样写List<String> list1=new ArrayList<String>(); 就表示你的两变定义的类型都为String, 否则new ArrayList()就会报敬告异常,自动转换list的时候也会报异常,因为不确定类型;这里就需要手动转换了。
List list1=new ArrayList<String>();
list1.add("cccc");
list1.add("cc11");
list1.add(123);
for (int i = 0; i <list1.size(); i++) {
System.out.println(list1.get(i));
}
而这个,就是说你new 的类型是String ,而list的类型是不确定的,它会自动转换,不过在java中写代码的时候list下方肯定会报敬告,说可能会发生异常
所以最好两边类型都确定为一种类型.
当你不确定类型的时候,请按照以下方式
List<Object> objects= new ArrayList<Object>();
确定类型的时候可以这样写
List<String> objects= new ArrayList<String>();
这样就没有任何错误了。
也不用手动转换了
list1.add(123);
list1.add("cccc");
list1.add("cc11");
for (int i = 0; i <list1.size(); i++) {
System.out.println(list1.size());
}
这个是代表你的这个list类型是String 类型,但是你所new的类型不确定,你应该这样写List<String> list1=new ArrayList<String>(); 就表示你的两变定义的类型都为String, 否则new ArrayList()就会报敬告异常,自动转换list的时候也会报异常,因为不确定类型;这里就需要手动转换了。
List list1=new ArrayList<String>();
list1.add("cccc");
list1.add("cc11");
list1.add(123);
for (int i = 0; i <list1.size(); i++) {
System.out.println(list1.get(i));
}
而这个,就是说你new 的类型是String ,而list的类型是不确定的,它会自动转换,不过在java中写代码的时候list下方肯定会报敬告,说可能会发生异常
所以最好两边类型都确定为一种类型.
当你不确定类型的时候,请按照以下方式
List<Object> objects= new ArrayList<Object>();
确定类型的时候可以这样写
List<String> objects= new ArrayList<String>();
这样就没有任何错误了。
也不用手动转换了
追问
你好。
你的意思就是说,这里面存在一个前后的问题?
以及自动与手动转换的问题?
// 以下1、2是没有问题的
(1) Vector v1 = new Vector();
(2) Vector v = v1;
V1没有确定 类型,所以可以和任意的其他(比如V)类型匹配?
是这样吗?
追答
没有前后问题,总的一句话来说,就是定义类型
展开全部
泛型,就是在编译之前做类型检查。
相比之前没有泛型的情况,List.get(int) 方法只能返回Object对象:
List l = new List();
l.add(new Student());
Object o = l.get(0);
Student s = (Student)s;
如果add进去的类型和get出来后强转的类型不匹配,则会出现运行时错误,不能在编译期检查到。
现在用泛型:
List<Student> l = new List<Student>();
l.add(new Student());
Student s = l.get(0);
避免了强转的代码,而且可以在编译的时候就检测到类型转换的错误。
你提出的问题,这种编译错误类似于将一个更大类型赋值给更小的类型,将父类赋值给子类的关系: List<String> list1=new ArrayList<Object>();
相比之前没有泛型的情况,List.get(int) 方法只能返回Object对象:
List l = new List();
l.add(new Student());
Object o = l.get(0);
Student s = (Student)s;
如果add进去的类型和get出来后强转的类型不匹配,则会出现运行时错误,不能在编译期检查到。
现在用泛型:
List<Student> l = new List<Student>();
l.add(new Student());
Student s = l.get(0);
避免了强转的代码,而且可以在编译的时候就检测到类型转换的错误。
你提出的问题,这种编译错误类似于将一个更大类型赋值给更小的类型,将父类赋值给子类的关系: List<String> list1=new ArrayList<Object>();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
实际上是这样的 List<Object> list1 = new ArrayList<String>();
List<Object> 你不写得话 默认是会给你加上的
new ArrayList<String>(); 的<String> 你是必须要写得 以为你要使用范型
List<Object> 你不写得话 默认是会给你加上的
new ArrayList<String>(); 的<String> 你是必须要写得 以为你要使用范型
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询