java泛型的学习笔记[2]—实际使用

  继上一文《java泛型的学习笔记[1]—基础知识》之后,本文将介绍泛型的一些应用和应用过程中遇到的问题。

  在此之前,我们先给出一张类图:

 

1)泛型类型的子类型问题

  我们首先来看这样一句代码。该行代码正确,因为Cat是Animal的子类型

    Animal animal=new Cat();//

  但是再看下一句代码:

    AarrayList<Animal> animals=new ArrayList<Cat>();//编译出错

       这句代码编译出错,因为虽然因为Cat是Animal的子类型,但是: ArrayList<Cat>不是AarrayList<Animal>的子类型。

  如果深究起来,只能说ArrayList<Cat>是List<Cat>的子类型。而ArrayList<Cat>与AarrayList<Animal>是两个不兼容的类型,或者说是两个没有关系的类型。

 

2)通配符的使用问题

  我们先来看看两段编译出错的代码。其

   1.ArrayList<?> list=new ArrayList<Cat>();
      list.add(new Cat());//编译出错

  2.ArrayList<? extends Animal> list=new ArrayList<Cat>();
           list.add(new Cat());//编译出错

       出错的原因或许大家能想明白:使用了"?"或者"? extends Animal"的通配符,我们不确定“?”代表的类型。比如ArrayList<? extends Animal>,通配符可能代表的类型包括:Animal,Cat或Dog,还有SmallCat。若是“?”表示Dog,而这里的list.add(new Cat())肯定会出错,即?表示的类型与你想要添加数据的类型,可能是不兼容的。对于ArrayList<?>,其实也相当于ArrayList<?
extends Object>。所以1  和2 用法本质上是相同的。

  因此,为了消除不确定性,为了确保类型安全,对于使用"? extends"通配符的数据结构,都不允许往其中添加任何的值了。

  

  那么对于“? super ”类型的情况呢?

  比如:

  ArrayList<? super Cat> list=new ArrayList<Cat>();
       list.add(new Cat());//

       list.add(new SmallCat());//

      以上三句代码就是正确的。

  为什么会这样呢?原理其实不难:因为使用了"? super Cat"后,虽然“?”也充满了不确定性,包括:Cat,Animal,还有Object。但是其中却有一条确定性:Cat与SmallCat一定与?兼容。因为?可能的最底层次就是Cat,也就是说Cat和SmallCat一定是?本身的类型或?的子类型。这时,list.add(new Cat());与list.add(new SmallCat());当然是是能保证正确的。

 

3)泛型在SSH框架中的运用

    在ssh中,一般我们会自定义一些基类,对我们项目中的一些功能或代码进行封装。比如,我们通常会定义Dao层的基类,Service层的基类,还有Action的基类 等

  等。

             以DAO层为例,在做项目的时候每次都为每个POJO实体写一个对应的DAO很麻烦,虽然可以由IDE或者一些快速生成工具来生成,但是也难免需要更改。基于此

  原因,一般我们需要定义一个通用的泛型DAO来封装一些最基本的操作,包括对实体的增删改查等。这样就大大简化了代码,也保证了DAO层在使用时的类型安全。

    

 

OK,本文就到这里吧。欢迎各位参与讨论和补充内容。

    

  

时间: 2024-11-02 02:57:46

java泛型的学习笔记[2]—实际使用的相关文章

Java泛型的学习笔记[1]—基础知识

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法.本文主要描述的是泛型类. Java语言引入泛型的好处:1)最大程度的保证了类型安全:2)简化编译 我们以ArrayList类为例: 1)如果没有泛型,我们要不然需要为每一种类型X编写一个XArrayList类:要不然在ArrayList中用Object的对象来存储数据,然后每次取出对象时使用类型转换:       

Java中jqGrid 学习笔记整理——进阶篇(二)_java

相关阅读: Java中jqGrid 学习笔记整理--进阶篇(一) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2. 2.创建表 双击打

java对象序列化学习笔记

java对象|笔记 目前网络上关于对象序列化的文章不少,但是我发现详细叙述用法和原理的文章太少.本人把自己经过经验总结和实际运用中的体会写成的学习笔记贡献给大家.希望能为整个java社区的繁荣做一点事情.    序列化的过程就是对象写入字节流和从字节流中读取对象.将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机.对象序列化功能非常简单.强大,在RMI.Socket.JMS.EJB都有应用.对象序列化问题在网

java.util包学习笔记一

笔记 学习java2SDK 1.4.0 java.util里边有几个重要的接口,列在这里作为学习的总结: 1 java.util.Enumeration有两个方法hasMoreElements(),nextElement().使用方法如下://打印向量v的所有元素for(Enumeratin e = v.elements(); e.hasMoreElements();){ System.out.println(e.nextElement().toString());}这里注意要调用nextEle

Java软件开发学习笔记(一)

笔记 1. Java是一种现代的程序设计语言,并且生逢其时 Java语言拥有良好的特性(面向对象)和最好的价格(免费), 在最恰当的地方(在web上),又在最合适的时间(正好在web逐渐流行时)出现. 2. 1995年5月,第一版 1998年底,J2SDK 3. 抽象是计算中的关键概念 面向对象的程序设计集中于对抽象的识别和运用上 抽象是建立在分层上的 底层是编程语言,其上层是标准类库中的抽象,最上边的一层或若干层是由程序员建立的各种抽象 (每一层抽象都对实现为程序的系统提供一个较高层次的视角)

一位Java初学者的学习笔记

怎么样?是不是想起了自己当年挑灯苦学的场景,想起了当年被这些程序编码烦恼的日子?想变的牛逼就要多写代码,如果你想学习Java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料下载. 这些都是最基本的Java笔记,相信大家都是一看就会.

Java NIO 完全学习笔记(转)

本篇博客依照 Java NIO Tutorial 翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java NIO,被称为新 IO(New IO),是 Java 1.4 引入的,用来替代 IO API的. Java NIO:Channels and Buffers 标准的 Java IO API ,你操作的对象是字节流(byte stream)或者字符流(character stream),而 NIO,你

Java编程思想学习笔记——类型信息

前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定我们在编译时已经知道了所有的类型. (2)另一种是反射机制,它允许我们在运行时发现和使用类的信息. 为什么需要RTTI 以使用了多态的类层次结构的例子举例: 如上图,泛型是基类Shape,而派生出来的具体类有Circle,Square和Triangle. 这是一个类层次结构图,基类位于顶部,而派生类

Java软件开发学习笔记(二)

笔记 1. 相关知识1.1 Java编程语言是从一开始就支持软件本地化的第一个编程语言. 所有的字符串都使用Unicode 1.2 要本地化的内容: 数字 123,456.78 英国 ; 123.456,78 德国 货币 日期 3/22/61 美国 ; 22.03.1961 德国 March 22,1961 ; 英文 22. Marz 1961 德语 ; 1961年3月22日 中文 时间 文本 -> 图形用户界面(集中以上情况) 1.3 Locale类 locale, 简单来说是指语言和区域进行