zoukankan      html  css  js  c++  java
  • Java学习笔记——泛型

    假定T不仅要指定接口的类继承。使用下面的方式:

    public class some<T extends Iterable<T> & Comparable<T>>{}

    Java的泛型不具有共变性(假设B是A的子类,而Node<B>可视为一种Node<A>,则称Node具有共变性),只是能够使用类型通配字符?

    与extends来声明变量。使达到类似的共变性。

    Node<Apple> apple = new Node<>(new Apple(), null);
    Node<? extends Fruit> fruit = apple;  // 相似共变性效果;假设是Node<Fruit> fruit = apple; 则会编译错误

    若声明?

    不搭配extends,则默觉得?

     extends Object,如:

    Node<?> fruit = null;  // 相当于<span style="font-family: Arial, Helvetica, sans-serif;">Node<?

    extends Object></span>

    注意:这与声明Node<Object>不同。假设是声明为Node<Object>,则仅仅能參考至Node<Object>实例,以下的程序编译会出错:

    Node<Object> node = new Node<Integer>(1, null);  // 没有共变性

    应该是:

    Node<?> node = new Node<Integer>(1, null);


    一旦使用?与extends限制了T的类型。就仅仅能通过T声明的名称取得对象指定给Object,或将T声明的名称指定为null。除此之外,不能进行其它指定动作

    Node<? extends Fruit> fruit = new Node<>(new Apple(), null);
    Object o = node.value;
    node.value = null;
    Apple apple = node.value;  // 编译错误
    node.value = Apple apple();   // 编译错误

    以上程序。仅仅知道value參考的对象类型会是继承Fruit。但实际上会是Apple还是Banana?假设实际上node.value是Banana的实例。那指定给Apple类型的apple就是不正确的


    另:

    Java的泛型语法仅仅在编译时检查。运行时类型中未知的。运行时期实际上仅仅会知道是Object类型(又称为“类型抹除”),如:

    List<Integer> list1 = new ArrayList<>();
    List<String> list2 = new ArrayList<>();
    System.out.println(list1.equals(list2));  // 输出true














    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    解决在Pycharm中无法显示代码提示的问题
    解决在使用pip list时出现DEPRECATION
    Pycharm 有些库(函数)没有代码提示
    Oracle 11.2.0.4 For Windows 64bit+32bit 数据库
    Windows系统下oracle数据库每天定时备份
    PowerDesigner表创建脚本双引号问题
    Oracle11g 创建数据库中问题处理(必须运行Netca以配置监听程序)
    名人名言
    项目管理
    项目管理心得:一个项目经理的个人体会、经验总结(zz)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4810969.html
Copyright © 2011-2022 走看看