敬请牛人指点,关于泛型的2个问题
一直在看泛型,一直感觉困惑极多,先问两个问题,
List<Integer> li=new ArrayList<Integer>();
List<Number> ln=new ArrayList<Number>();
ln=li;
说是编译错误...我想问问
1、为什么会出现错误,java5 是怎么处理 这个的?
2、我们通常的多态实现,如下面代码
class A(){};
class a extends A{}
class b extends B{}
class c
{
A aa=new a();//或 aa=new b();
doMethod()
{
aa.xxx();//假设 xxx()是一个类A的方法,a和b都进行了实现
}
}
要是照 泛型的这个规定,以后这样的代码是不是就不能用了?!!!
还有一个就是
List<?> ls=new ArrayList<String>();
ls.add(new String("A"));
编译也会出错,说是 ? 是 通配符 ,不确定里面是什么值,所以不能往里面传入具体值
这是什么逻辑?不是已经初始化为new ArrayList<String>()了吗?
请大牛们指点指点迷津,谢谢!!!!!
[最优解释]
Java的泛型,做的是“编译时的类型检查”。
1、为什么会出现错误,java5 是怎么处理 这个的?
即使 类型 B 是 类型A 的子类型,那么 List<B> 和 List<A> 也没什么关系,List<B> 也不是 List<A> 的子类型,两种不同的泛型类型赋值就会报错。
还有一个就是
List<?> ls=new ArrayList<String>();
ls.add(new String("A"));
编译也会出错,说是 ? 是 通配符 ,不确定里面是什么值,所以不能往里面传入具体值
这是什么逻辑?不是已经初始化为new ArrayList<String>()了吗?
关键词是“编译”,编译当然会出错,因为 ls 声明的类型是 List<?> , 编译器只能看到声明的类型。
[其他解释]
// 如果下面这一句能通过编译的话
List<Number> ln = new ArrayList<Integer>();
// ln 声明的类型是 List<Number> , 那么任何 Number 类型都应该能安全的加进去
ln.add(Double.valueOf("1.0")); // runtime exception
Number[] numbers = new Integer[10];
numbers[0] = Double.valueOf("1.0"); // runtime exception
[其他解释]
一楼说有点意思!
[其他解释]
raistlic对第二个问题的解释,我觉得明白了一些,但是对第一个问题的解释,我还是不很清楚,我总觉得范型的使用会破坏多态性!!!这是我的个人理解....希望大牛们答疑解惑,谢谢
[其他解释]
List<Integer> li=new ArrayList<Integer>();
List<Number> ln=new ArrayList<Number>();
ln=li;
说是编译错误...我想问问
ln和li的类型不一样,泛型就是可以简单理解为不需类型转换,要不你的li取出值时,由于不知是什么类型必须先转换为Integer型。
[其他解释]
还望大牛们指点 指点
[其他解释]
第一个这样不就可以了
List<Integer> li=new ArrayList<Integer>();
List<? extends Number> ln=new ArrayList<Number>();//Number的子类包含Integer类
ln=li;
第二个是因为?是通配符,表示object,而你传了一个String类作为成员,当然会报错
[其他解释]
List<?> ls=new ArrayList<String>();
ls.add(new String("A"));