public static void main(String []args)
{
List <? extends Number> list = new ArrayList<Integer>();
test(list);
} public static void test(List <? extends Number> list)
{
list.add(new Integer(1)); //这里有错误,必须这样写才可以 list.add(new Integer(1),null),为什么?
}
{
List <? extends Number> list = new ArrayList<Integer>();
test(list);
} public static void test(List <? extends Number> list)
{
list.add(new Integer(1)); //这里有错误,必须这样写才可以 list.add(new Integer(1),null),为什么?
}
解决方案 »
- List数组怎么转换成int[]数组?
- sax方式解析xml 问什么仅能得到前两行的内容
- 请问这是怎么错,怎么改!
- 读取硬件设备,出现乱码的问题
- 一个小小的String问题
- 是否经过JDK1.4.1编译后的applet程序不能再放在<applet>标签中?
- 请教使用JList JComboBox JTree(这个不知道是不是这个名字 反正是树型结构)的用法
- 谁有JDK1.3或者1.4的API文档要中文的!
- 关于线程的wait()+notify(),以及过时的suspend()+resum()的问题,先谢谢大家的解答了
- Java 并发和处理器乱序执行
- 把线程的值传回主类的疑惑。
- Jsp开发wap2.0网站对手机的兼容性?
list.add(new Integer(1),null)调用的是add(int index, E element),即传入的元素是null,而new Integer(1)会自动拆箱为整数1,所以能够编译通过。
import java.util.*;public class Test
{
public static void main(String []args)
{
List <? extends Number> list = new ArrayList<Integer>();
test(list);
}
public static void test(List <? extends Number> list)
{
list.add(1, null); //这里有错误,必须这样写才可以 list.add(new Integer(1),null),为什么?
}
}
public static void test(List <? extends Number> list)
{
list.add(1,new Integer (1)); //仍然会出现错误,而且不能用list.add(E e),太尴尬了.
}
public static void main(String[] args) {
List<Number> list = new ArrayList<Number>();
test(list);
} public static void test(List<? super Number> list) {
list.add(new Integer(1));
}
这样做的话 list只能接受 Number及其超类的类型了 不是我想要的结果,我想要的是list必须是Float,Integer,Double等等,但是他们中的任何一种list里必须保证不能存在其他类型的对象,如Float中部能存在Integer,即使你故意插入也会报错这样的.
为何不直接List <Integer> list = new ArrayList<Integer>();
我理解你的意思是否就是:
list<Integer> intList;
List<Float> floatList;
List<Double> doubleList;
恩对就是这个意思 ,这个List <? extends Number>是笔误,当时做测试的时候没改掉.....
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
test(list,new Integer(10));
// test(list,new Double(10));
} public static <T extends Number> void test(List<T> list,T number) {
list.add(number);
}
List<? extends Fruit> list = new ArrayList<Apple>();
//list.add(new Apple());Error
//list.add(new Fruit());Error
List<? super Fruit> list = new ArrayList<Apple>();
list.add(new Apple());//可以
list.add(new Fruit());//可以
List<? extends Fruit> list = new ArrayList<Apple>();
list中为什么不能加入Fruit类和Fruit类的子类呢,原因是这样的
List<? extends Fruit>表示上限是Fruit,下面这样的赋值都是合法的
List<? extends Fruit> list1 = new ArrayList<Fruit>();
List<? extends Fruit> list2 = new ArrayList<Apple>();
List<? extends Fruit> list3 = new ArrayList<Jonathan>();
如果List<? extends Fruit>支持add方法的方法合法的话
list1可以add Fruit和所有Fruit的子类
list2可以add Apple和所有Apple的子类
list3可以add Jonathan和所有Jonathan的子类
这样的话,问题就出现了
List<? extends Fruit>所应该持有的对象是Fruit的子类,而且具体是哪一个
子类还是个未知数,所以加入任何Fruit的子类都会有问题,因为如果add Apple
的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan>()
Apple的加入肯定是不行的,如果 如果add Jonathan
的话,可能List<? extends Fruit>持有的对象是new ArrayList<Jonathan的子类>()
Jonathan的加入又不合法,所以List<? extends Fruit> list 不能进行add
而List<? super Fruit> list 表示list持有的对象是Fruit的父类,下限是 Fruit,所以list中add Fruit或Fruit的子类是没有问题的
{
List <Number> list = new ArrayList<Number>();
test(list);
}
public static void test(List<Number> list)
{
list.add(new Integer(1));
}小小问题 干嘛 搞那 复杂
public static void test(List<? extends Number> list)
{
((List<Number>)(list)).add(new Integer(1));
}
防止 Number 被添加