List<?> list1和List<?> list2,我希望通过索引把list1的某几个索引值放到list2,代码我是这样写的:list2.add(list1.get(i));
但是报语法错误,正确的语法应该怎么写呢?
List<?> list1和List<?> list2,我希望通过索引把list1的某几个索引值放到list2,代码我是这样写的:list2.add(list1.get(i));
但是报语法错误,正确的语法应该怎么写呢?
你明白一个单纯的“?”是什么意思吗?它代表的是任意类型。既可以是有继承关系的,也可以是八竿子都打不到的。
比如你想写的大约是这样的
class gen{
pulbic <? extends Number>void listMove(List <?>list1 , List<?> list2,Int i){
list2.add(list1.get(i));
}
}
但是请注意这里?号代表的是任意一个Number的子类,这意味着你如果传入像list1 是List<Long>而list2是List<Double>这样的同级泛型参数,就像这样来调用这个函数
list1 = new List<Long >();
list2 = new List<Double>();
listMove(list1, list2, i);
这个函数的目的显然是把list1 的第i个元素放入list2中,但是请注意list1和list2是不相同,也没有继承关系的同级别类型,你正试图把一个Long 类型放入一个只能够放置Double类型的List 中,如果java允许你这样来操作元素,那不是和泛型本身希望提高类型安全的目的背道而驰了吗?
这个问题里你需要注意的是,想要传递的类型参数是有关系的,lIst1的?号应该是list2的本身或者子类才对,你应该这样定义你的方法,你需要对这两个?号有一定的约束
这样来定义
public < T extends Object>
void listMove(List<? extends T> list1//有条件的约束,?应该是T的子类
, List<T> list2 ,int i){
list2.add(list1.get(i));
}
你的两个类型是相同的吗
加个判断 符合条件就添加
可以放入,但条件是List1<?>的?类型必须与List2<?>中?类型相同或者可以显示转化成List2中?的类型
当然最好不要出现数组越界的异常,所以你在取出来的时候最好判断一下,各自的非空情况