美文网首页
Java编程思想之范型(1)

Java编程思想之范型(1)

作者: 码头军 | 来源:发表于2018-08-22 11:49 被阅读0次

    Java范型是在Java5.0(1.5)版本中提出的,虽然Oracle已经发布了Java 1.9,Java 12的feature也已经在讨论中,但对于很多程序员来讲,对范型的理解和运用并不好,接下来的系列文章带大家一起深入理解Java范型。该系列问题第一篇先请感兴趣的同学看一些范型相关的问题,答案随后给出。

    1. 定义两个List:
    List<Number> numbers = newArrayList<Number>();
    List<Integer> integers = new ArrayList<>();
    

    有个方法:

    public static void printItem(List<Number>list) {
          for (Numbernumber : list) {
               System.out.println(number+ "");
          }
    }
    

    问:printItem(numbers)和printItem(integers)是否有问题?

    1. 声明一个List<Object> objectList =new ArrayList<>();以下选项哪些是正确的?
    1) list.add(2L);
    
    2) list.add(1);
    
    3) list.add(1.0);
    
    4) list.add(null);
    
    5) list.add(new Object());
    
    1. 声明一个list,List<?>list = new ArrayList<>();以下语句哪些是对的?
    1) list.add("a");
    
    2) list.add(1);
    
    3) list.add(new Object())
    
    4) list.add(null);
    
    1. 针对上一问题,如果把list改为List<Object>list = new ArrayList<>();4个选项哪些是正确的?

    2. 声明一个List<? extends Number>extendsNumberList = new ArrayList<>();以下选项哪些是正确的?

    1) list.add(2L);
    
    2) list.add(1);
    
    3) list.add(null);
    
    1. 声明一个List<? super Number> superNumberList= new ArrayList<>();以下选项哪些是正确的?
    1) list.add(2L);
    
    2) list.add(1);
    
    3) list.add(1.0);
    
    4) list.add(null);
    
    5) list.add(newObject());
    
    1. 通过上述两题,请说出在范型中extends和super关键字的用法,可以通过一个具体的类来说明,例如List<?extendsNumber> vs List<? super Number>

    2. 声明一个List<Integer> intList = newArrayList,以下代码片段编译、执行都正常吗:

    if(intList instanceof List){
        System.out.println("List<Integer> is list");
    }
    
    1. 声明一个List<Integer> intList = newArrayList,代码片段编译、执行都正常吗:
    if(intListinstanceof List<Integer>){
        System.out.println("List<Integer> is list");
    }
    
    1. Java引入范型(Generics)的目的有哪些?

    2. 以下代码片段编译、运行是否有问题?

    public class GenericTest{
        interface Int{
            void m1();
        }
        static class Clz{
            void m2(){
                System.out.println("in Clz m2");
            };
        }
        static class Gclz<T extends Clz & Int >{
            void printClz(T t){
                System.out.println("T:" + t.getClass().getName());
                System.out.println("T:" + t.getClass().getSimpleName());
                t.m1();
                t.m2();
            }
        }
        static class AnyClz extends Clz implements Int{
            @Override
            public void m1() {
                System.out.println("in AnyClz m1");
            }
        }
        public static void main(String ... args){
            AnyClz anyClz = new AnyClz();
            Gclz<AnyClz> gclz = new Gclz<>();
            gclz.printClz(anyClz);
        }
    }
    
    1. 如下两个方法签名能否定义在同一个类中,为什么?
    public static void printList(List<?> list){...}
    public static void printList(List<Object> list){...}
    
    1. 定义一个List<Integer>list = Arrays.asList(5,6),调用上题中定义的两个方法打印list元素,是否有问题?

    加入公众号获取上述问题答案:

    公众号二维码1.jpg

    加入“Java编程思想读书会”微信群,和大量技术专家们讨论技术:

    Java编程思想读书会群二维码.jpg

    相关文章

      网友评论

          本文标题:Java编程思想之范型(1)

          本文链接:https://www.haomeiwen.com/subject/tqpeiftx.html