下面代码中如何用泛型实现 “编译出错”问题。
也就是实现注释“不用泛型”下面的代码?
谢谢各位import java.util.ArrayList;
import java.util.List;
public class Fanxing {
public static void main(String[] args) {
List<A> listA = new ArrayList<A>();
listA.add(new C());
listA.add(new C());
listA.add(new C());
listA.add(new C());
// List<C> listC = (List<C>)listA; //编译出错。
// List<C> listC = (C)listA; //编译出错
// List<C> listC = listA; //编译出错
/***** 不用泛型 ****/
List<C> listC = new ArrayList<C>();
for(A a:listA){
listC.add((C)a);
}
}
}
class A {
}
class E {
}
class B extends A {
}
class C extends A {
}
也就是实现注释“不用泛型”下面的代码?
谢谢各位import java.util.ArrayList;
import java.util.List;
public class Fanxing {
public static void main(String[] args) {
List<A> listA = new ArrayList<A>();
listA.add(new C());
listA.add(new C());
listA.add(new C());
listA.add(new C());
// List<C> listC = (List<C>)listA; //编译出错。
// List<C> listC = (C)listA; //编译出错
// List<C> listC = listA; //编译出错
/***** 不用泛型 ****/
List<C> listC = new ArrayList<C>();
for(A a:listA){
listC.add((C)a);
}
}
}
class A {
}
class E {
}
class B extends A {
}
class C extends A {
}
List<C> listC = new ArrayList<C>();
for(A a:listA){
listC.add((C)a);
} 这段代码用了泛型 怎么能说没用泛型你编译出错时因为的C类是继承A类的,那么C的范围肯定或至少要比A大,添加泛型的时候,就不允许你向下转型
List<A> listA = new ArrayList<A>();
List<C> listC = new ArrayList<C>();
for(C c: listC){
listA.add(c);
}
在向listA中添加对象时,会自动向上转型.反之,则需要强转了.
如果要强转存在一个效率问题。如果listA 集合存了较大的数据量,但明确存放的子类是什么。比如明确存放了C子类。
先将listA 强转成listC,如果一个一个拿出来循环强转。。势必影响到效率
import java.util.List;public class TestGen {
public static void main(String[] args){
//创建一个List<String>对象
List<String> strList=new ArrayList<String>();
//将strList作为参数来调用test()方法
TestGen.test(strList);//①
}
public static void test(List<Object> c){
for(int i=0;i<c.size();i++){
System.out.println(c.get(i));
}
}
}编译上面的程序,将在①处发生错误:无法将Test中的test(java.util.List <java.lang.Object>)应用于(java.util.List <java.lang.String>)
错误信息告诉我们:虽然String是Object的子类,但是List <String>类并不是List <Object>的子类,也就是说List <String>对象不能当成List <Object>对象使用
我明白大家的意思简单说就是listA中既可以存放B对象也可以存放C对象。直接强转成listC 是不可以的。但如果明确了listA中存放的都是C得对象。现需要将listA转成listC 怎么来实现呢?
eg。主题中的方法,遍历listA然后对每一个对象进行强转 再放进listC中方法。
但 如果listA中的数据量很大时,势必产生效率上的问题。
大家有什么好的办法么
类比一下
所以ListA是不能向下转化为ListC的
// List<C> listC = (C)listA; //编译出错
// List<C> listC = listA; //编译出错和泛型没有关系,是塑形时父类不能强制塑形为子类,但反向是可以的