`

15.泛型

阅读更多

1.类型参数
 public class Holder<T>
 不用特别指定具体类型。
2.返回多个对象
  元组:将一组对象存在单一对象。也称为数据传送对象。
  public class Tuple<A,B>
3.基本类型无法作为类型参数。
4.泛型方法
   原生类型<T>
  public <T> void  f<T x> 将泛型参数列表置于返回值之前。
  public <T> void  f<T...x>泛型可变参数,不用显式填充数组x
  public static <K,V> Map<K,V> map(){
   return new HashMap<K,V>();
  }
  Map<String,List<String>> sls = New.map();这就是类型参数推断
 
  New.map();//不能编译,不知道类型
  New.<String,List<String>>map();//显式类型说明

5.擦除
  Class c1 = new ArrayList<String>().getClass(); 
  Class c2 = new ArrayList<Integer>().getClass(); 
  c1==c2//true
  Arrays.toString(c1.getTypeParameters())//E
  在泛型代码内部,无法获得任何有关泛型参数类型的信息。
6.边界
  在编写泛型代码时,都要记住它只是一个Object,严格来说是是它的第一边界。
  任何在运行时需要知道确切类型信息的操作都将无法工作。
  T extends Hasf 那么Hasf就是T的第一边界。
7.通配符
  一个数组new Apple[]可以持有Apple及其子类。
  List<Fruit> flist = new ArrayList<Fruit>();//不能写成new ArrayList<Apple>(),
  Apple的List不是Fruit的List,Apple的List可以持有Apple及其子类型,Fruit的list则可以持有任何类型的Fruit。

  List<? extends Fruit> flist = new ArrayList<Apple>();//什么都不能添加,下界不确定。
  从编译器的角度考虑,它要持有Fruit或Fruit的某种子类型,但不知道是那种类型,所以就无法安全的向其中添加任何对象。
  这里虽然指明为Apple,但是编译器并不知道,添加任何类型都是不安全的。
 
  List<? super Apple> flist ;//可以添加Apple及其子类,其下界就是Apple
  List<? super T>可以,<T super Apple>不合法,T是泛型参数,有可能传错。

  无界通配符
  List<Integer>  li = new ArrayList<Integer>;
  li.add(new Integer(12));
  List<?> lu = li;
  lu.add(new Integer(43));//error
  对于lu, 编译器不能对List的类型参数做出足够严密的推理。
  add方法类型安全,但是lu擦除并不能确定所加对象的类型。                        
  引入类型通配符,可以从中检索元素,但是不能添加元素。修改功能的方法比不修改方法需要更多的类型信息。
  lu.clear();可以运行,因为它不依赖类型安全。
 
8.泛型问题
  a.不能保存基本类型
    不能创建ArrayList<int>,可以用ArrayList<Integer>但是性能低。
  b.一个类不能实现同一个泛型接口的两种变体
    如interface Fruit<t>{} 那么
    Class A extends Fruit<Apple> implements Fruit<Orange>{};//error 
    擦除会使两个接口相同。
  c.带有泛型参数的转型和instanceof不会有任何效果
  d.重载
    void f(List<T> v){}
    void f(List<W> v){}
    擦除使两个方法相同。
9.动态类型安全
  容器的ArrayList<Dog> dl = new ArrayList<Dog>();
  虽然有类型安全,但还是有可能加入错的数据。
  @SupressWarning("nochecked")  
  public void addCat(List dogl){
   dogl.add(new Cat());
  }   
  addCat(dl);//这是可以的。
  所以List<Dog> dl2 = Collections.checkList(dl,Dog.class);//加入类型检查
  持续更新中。。。。

分享到:
评论

相关推荐

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 09.泛型(共15页).ppt

    泛型(共15页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 10.异常处理(共24页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 11.AWT编程(共46页).ppt 推荐优质Java课程 疯狂...

    C#泛型详解由入门到精通.docx

    目录 1. 泛型简介 2 1.1.理解泛型 2 1.2.泛型简介 3 2.泛型的优点 3 3.泛型类型参数 4 ...5.泛型类 9 ...6.泛型接口 11 ...7.泛型方法 13 ...8.泛型委托 15 9.泛型代码中的默认关键字 17 10.泛型和属性 18

    Java面试经典题,对JAVA面试很有帮助

    15.泛型常用特点 16.Java创建对象有几种方式 17.有没有可能两个不相等的对象有相同的hashcode 18.深拷贝和浅拷贝的区别是什么 19.final有哪些用法 20.static都有哪些用法 21.3*0.1 == 0.3返回值是什么 22.a=a+b与a+=...

    Jdk15泛型的实现

    Jdk15泛型的实现

    corejava培训文档

    15. 十四 标准I/O流与文件 15.1. 对文件的操作 15.2. 处理跨平台性 15.3. 对象的序列化接口 15.4. I/O流基础 15.5. 流的分类 15.6. I/O输入输出 16. 十五 网络编程 16.1. 网络基础知识 16.2. TCP Socket...

    【Kotlin教程】EasyKotlin.zip

    6.泛型 7.面向对象编程 8.函数式编程 9.协程 10.Kotlin与Java互操作 11.使用Kotlin集成SpringBoot开发Web服务端 12.使用Kotlin集成Gradle开发 13.使用Kotlin和Anko的Android开发 14.使用 Kotlin DSL 15.Kotlin 文件...

    typescript快速入门(79页PDF文档)

    9. 泛型 10. 枚举 11. 类型推断 12. 类型兼容性 13. 高级类型 14. Symbols 15. 迭代器和生成器 16. 模块 17. 命名空间 18. 命名空间和模块的区别 19. 模块解析 20. 声明合并 21. 类型声明 22. JSX 23. 装饰器 24. ...

    自考C++2009年1月试题和答案

    2009年1月C++的试题和答案1. A 2. B 3. D 4. D 5. A 6. D 7. C 8. C 9. B 10....11. D 12.... B 15.... 22....23. Hex:64 24....25. main 26.complex&lt;float&gt; num(2.2,1.3)或...35. 泛型算法 36. 派生 37. push_back(const T&) 38. new

    java学习笔记 初学者必读

    15. 十四•标准I/O流与文件 15-46 15.1. 对文件的操作 15-46 15.2. 处理跨平台性 15-46 15.3. 对象的序列化接口 15-47 15.4. I/O流基础 15-47 15.5. 流的分类 15-47 15.6. I/O输入输出 15-48 16. 十五•网络编程 16-...

    corejavaNoteBook

    15. 十四•标准I/O流与文件 15-46 15.1. 对文件的操作 15-46 15.2. 处理跨平台性 15-46 15.3. 对象的序列化接口 15-47 15.4. I/O流基础 15-47 15.5. 流的分类 15-47 15.6. I/O输入输出 15-48 16. 十五•网络编程 16-...

    Swift4.0源代码最新201802

    17.泛型.playground 18.异常错误.playground 19.断言.playground 1初识.playground 20.自动引用计数(strong,weak,unowned).playground 21.检测API.playground 22.?对象的标识.playground 23.注释.playground 24.?元...

    c++采用Boost方式,搭建服务端、客户端通信

    6.泛型编程; 7.模板元编程; 8.预处理元编程; 9.并发编程; 10.数学和数字; 11.排错和测试; 12.数据结构; 13.图像处理; 14.输入输出; 15.跨语言混合编程; 16.内存管理; 17.解析; 18.编程接口; 19.杂项; ...

    MLDN魔乐所有javaSE的pdf文档

    10.4.泛型.pdf 10.5.异常的捕获及处理.pdf 11.1.Java常用类库(上).pdf 11.2.多线程.pdf 12.Java常用类库(下).pdf 13.Java IO(上).pdf 14.Java IO(下).pdf 15.Java类集框架.pdf 16.1.Java反射机制.pdf 16.2.枚举....

    java研发军团面试手册

    泛型24道/异常8道/IO与NIO15道/反射11道/序列化11道/注解2道/多线程&并发108道/JVM87道/MYSql 83道/redis50道/Memcached24道/MongDB95道/Spring131道/SpringBoot92道/SpringCloud35道/RabbitMQ32道/Dubbo40道/...

    C++四书五经 - 04. 模板和泛型编程

    15 Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference 16 Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library 17 Generic Programming and the ...

    推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 15.输入输出(共41页).ppt

    泛型(共15页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 10.异常处理(共24页).ppt 推荐优质Java课程 疯狂Java语言编程 Java入门到进阶教程 11.AWT编程(共46页).ppt 推荐优质Java课程 疯狂...

    陈广C#视屏教材部分源码

    类的析构(3) 15.类的修饰符 16.类型转换(1) 17.类型转换(2) 18.属性(1) 19.属性(2) 20.索引器(1) 21.索引器(2) 22.索引器(3) 23.索引器(4) 24.委托(1) 25.委托(2) 26.事件(1) 27.事件(2) 28.虚方法 29.抽象类 30...

    陈广c#视屏8-10.rar

    类的析构(3) 15.类的修饰符 16.类型转换(1) 17.类型转换(2) 18.属性(1) 19.属性(2) 20.索引器(1) 21.索引器(2) 22.索引器(3) 23.索引器(4) 24.委托(1) 25.委托(2) 26.事件(1) 27.事件(2) 28.虚方法 29.抽象类 30...

    疯狂Java语言编程 程序源代码 全部源码 共18个章节.rar

    01.Java语言概述 02.理解结构化程序设计_理解面向对象 03.数据类型和运算符 ...09.泛型 10.异常处理 11.AWT编程 12.Swing编程 13.JDBC编程 14.Annotation 15.输入输出 16.多线程 17.网络编程 18.类加载与反射

Global site tag (gtag.js) - Google Analytics