java吧 关注:1,236,059贴子:12,704,681
  • 10回复贴,共1

Java 每日一题:2016年8月19日

只看楼主收藏回复

每天在这里贴一道 Java 题。
问题不难,有 Java 的基本知识就可以做出来。
问题也不偏,日常工作中时不时会碰到。
每日一题索引页:52.36.153.52:8080/javaquestions/

请问上面的程序有无编译错误?


1楼2016-08-19 13:01回复
    源程序:
    package javaquestions;
    import java.util.ArrayList;
    import java.util.List;
    public class JavaQuestion20160819
    {
    public static void main(String[] args)
    {
    List<Animal> list1 = new ArrayList<Animal>(); // 1
    List<Dog> list2 = new ArrayList<Dog>();// 2
    List<? extends Animal> list3 = new ArrayList<Dog>(); // 3
    method(list1); // 4
    method(list2); // 5
    method(list3); // 6
    }
    public static void method(List<? extends Animal> aList)
    {
    for (Animal animal : aList) // 7
    {
    System.out.println(animal);
    }
    aList.add(new Animal()); // 8
    aList.add(new Dog()); // 9
    aList.add(null); // 10
    }
    }
    class Animal
    {
    }
    class Dog extends Animal
    {
    }


    2楼2016-08-19 13:02
    回复
      5.6应该会报错吧,


      IP属地:广东来自Android客户端3楼2016-08-19 13:10
      回复
        快点来人啊 实在不会了


        4楼2016-08-19 20:11
        收起回复
          子曰:“发愤忘食,乐以忘忧不知老之将至…


          来自iPhone客户端5楼2016-08-19 20:14
          回复
            这是泛型里的知识点,应该不会有编译错误吧


            IP属地:湖北来自Android客户端6楼2016-08-19 21:09
            回复
              8和9 有编译错误


              7楼2016-08-19 22:18
              回复
                我去,8 9报错了,说只能添加null值


                IP属地:广东8楼2016-08-19 22:22
                回复
                  求楼主解答


                  9楼2016-08-23 19:08
                  回复
                    简单解释一下。如果看不懂,就去看书吧。Java的泛型还是有点难度的。
                    方法的参数是:List<? extends Animal> aList ,这说明传入的参数可以是 List<Animal>,可以是 List<Dog>,也可以是List<Aniaml的任一子类>。
                    因为List 中元素的类型是 Animal 或 Animal 的子类,所以注释 7 处的 for-each循环不会有任何问题。但你如果往aList 中增加元素,就会出问题。
                    假设你把 list2 (List<Dog>)传入该方法,在这个方法里,你使用 aList.add(new Animal()); 增加了一个 Animal 对象。方法运行完之后,你继续使用 list2 变量。因为 list2 的类型是 Dog,编译器认为list2中所有的元素都是 Dog,但此时 list2中已经混进来一个 Animal 对象,使用list2 的时候肯定会出类型转换异常。为了避免这种情况出现,对使用 ?或 ? extends 声明的的泛型集合,不能添加元素(null 是例外)。
                    如果需要在集合中添加元素,就需要使用 super 关键字。但使用 super 之后也会有很多限制。


                    11楼2016-08-23 21:42
                    回复