JAVA泛型--待续

原做法:

 

Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");

泛型做法:

Map<K,V> m = new HashMap()<K,V>;
m.put("key", "blarg");//非<K,V>类型无法操作
String s = m.get("key");//获取无须强制转换

 

1:泛型(Generic type 或者 generics),对象类型的扩展,在对象类型相同情况下的一个参数化限定。

2:好处:提高程序的类型安全,将类型检查从运行时提前到编译时,入参限定检查阻止错误输入,出参无须强制类型转换。原类型可能对应的Object限定,实际运用需要更加细化。

3:它是编译阶段的类型检查,加泛型不影响JVM和类文件,反射操作可绕过泛型限定;

4:适用对象:除了异常类型、枚举或匿名内部类以外,任何类都可以具有类型参数

5:方式:声明对象时,使用<>加上大写单字母,

  字母推荐: K —— 键,比如映射的键。 
        V —— 值,比如 List 和 Set 的内容,或者 Map 中的值。 
        E —— 异常类。 
        T —— 泛型。

6:注意:泛型不是 协定 的(协定的意思:假设A扩展自B,则使用B的地方可以使用A,即A是B的一种,非协变即泛型不支持继承,比较严格)

 协定eg:

  Integer[] intArray = new Integer[10]; 
  Number[] numberArray = intArray;//valid

 非协定eg1:

  List<Integer> intList = new ArrayList<Integer>();
  List<Number> numberList = intList; // invalid

  numberList.add(new Float(3.1415));//编译出错,此处numberList是intList引用

 非协定eg2:

  void printList(List l) { //入参I可能因为参数类型限定为原始类型而出现类型不安全,假设入参为List<Integer>
    for (Object o : l)
      System.out.println(o);
  }

 

 非协定eg3:

  void printList(List<Object> l) { //假设入参为List<Integer>,而List<Integer>不是List<Object>,参看非协变eg1.
    for (Object o : l) 
      System.out.println(o); 
  }

 由此引出 通配符 ? 通配符的引入在于可以安全检索元素(类型的任意限定肯定是扩展自Object),而非添加元素(编译器并不知道原类型的限定,添加是未知的,不被允许的)

 非协定eg4:

  void printList(List<?> l) { //List<?> 是任何泛型 List 的父类型,所以完全可以将 List<Object>、List<Integer> 或 List<List<List<Flutzpah>>> 传递给 printList()
    for (Object o : l) 
      System.out.println(o); 
  }

7:泛型类(在类定义中添加一个形式类型参数列表),根据该定义可以在多个方法签名中实施类型约束

8:方法的泛型化与所在的类是否为泛型类无关,泛型方法用于在该方法的多个参数之间宣称一个类型约束

eg:

  public <T> T ifThenElse(boolean b, T first, T second) {//不用显式地告诉编译器T是什么,它只需要做到带T的参数及返回值都是同一类型即可
    return b ? first : second;
  }

9:泛型类和泛型方法的选择

  a:当泛型方法是静态方法时,编译器无法知道该类到底是什么泛型,故不用泛型类而用泛型方法

  b:当T约束仅针对方法,局部约束的时候不需要泛型类,因为泛型类的约束会导致所有的实例对象都是用的同一个T,导致该方法也是使用的同一个T,而存在这种需求:A类的实例a1和a2的方法的类型约束不需要一样;

10:限定类型,附加约束(类-----无泛型,类类型-------一般泛型,类类型约束------带约束泛型)

eg:

  public class Matrix<V extends Number> { ... }//Matrix由哪个泛型限定不知道,但必须是Number或Number子类;若无泛型,假设由Object限定,这样可以解释List.get() 在 List<?> 上调用时返回 Object

  public static void main(String[] args) {
    Matrix<Number> in = new Matrix<Number>();//valid

    Matrix<Integer> in = new Matrix<Integer>();//valid

    Matrix<Float> in = new Matrix<Float>();//valid

  }

 

整理自:http://www.cnblogs.com/panjun-Donet/archive/2008/09/27/1300609.html

 

转载于:https://www.cnblogs.com/onlyEnglish/p/8784787.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tortoise SVN 版本控制常用操作知识

Tortoise SVN 版本控制常用操作知识 Posted on 2010-11-26 23:07 szh114 阅读(5897) 评论(0) 编辑 收藏 今天老大跑过来问我如何把SVN服务器上的当前版本回退到某一个版本上去&#xff0c;我没回答上来&#xff0c;很失败&#xff0c;所以现在整理一下Tortoise SVN的操作知识&…

如何导入任何JBoss BRMS示例项目

在过去几周内&#xff0c;JBoss BRMS演示的用户反复询问我以下内容时&#xff0c;会给您这些提示和技巧&#xff1a; “如何将与各种JBoss BRMS演示项目相关的项目导入到我自己的现有安装中&#xff1f;” 这意味着用户希望在产品的个人安装中有一个示例项目&#xff0c;而无…

2110: 扫雷

http://acm.zcmu.edu.cn/JudgeOnline/problem.php?id2110 2110: 扫雷 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 88 Solved: 36[Submit][Status][Web Board]Description 扫雷游戏你一定玩过吧&#xff01;现在给你若干个nm的地雷阵&#xff0c;请你计算出每个矩阵中每…

使用eclipse生成文档(javadoc)

使用eclipse生成文档&#xff08;javadoc&#xff09;主要有三种方法&#xff1a; 1&#xff0c;在项目列表中按右键&#xff0c;选择Export&#xff08;导出&#xff09;&#xff0c;然后在Export(导出)对话框中选择java下的javadoc&#xff0c;提交到下一步。 在Javadoc Gene…

青椒苗

转载于:https://www.cnblogs.com/wainiwann/p/8793418.html

更改日志级别_如何在运行时更改日志记录级别

更改日志级别在运行时中更改日志记录级别非常重要&#xff0c;这主要在生产环境中非常重要&#xff0c;在生产环境中&#xff0c;您可能希望在有限的时间内进行调试日志记录。 好了&#xff0c;更改根记录器非常简单–假设您有一个具有所需记录级别的输入参数&#xff0c;只需…

JDBC和Ibatis中的Date,Time,Timestamp处理

JDBC和Ibatis中的Date,Time,Timestamp处理 November 25th, 2010西坪 Leave a commentGo to comments在此前&#xff0c;遇到过使用Ibatis操作Oracle时时间精度丢失的问题&#xff0c;昨天又遇到JDBC操作MySQL时间字段的问题&#xff0c;从网上看到各种式样的解释这些问题的博文…

每日算法之抽签

X星球要派出一个5人组成的观察团前往W星。其中&#xff1a;A国最多可以派出4人。B国最多可以派出2人。C国最多可以派出2人。....那么最终派往W星的观察团会有多少种国别的不同组合呢&#xff1f;下面的程序解决了这个问题。数组a[] 中既是每个国家可以派出的最多的名额。程序执…

如何开始Java机器学习

什么是开始使用Java机器学习的最佳工具&#xff1f; 他们已经存在了一段时间&#xff0c;但如今看来&#xff0c;每个人都在谈论人工智能和机器学习。 对于科学家和研究人员而言&#xff0c;它已不再是秘密&#xff0c;几乎可以在任何新兴技术中实现。 在下面的文章中&#x…

keil中关于使用_at_绝对地址定位问题

keil中关于使用_at_绝对地址定位问题 2008-01-07 13:46:26| 分类&#xff1a; MCU51 | 标签&#xff1a; |字号大中小 订阅 在网上看到有人提到在keil中使用_at_进行绝对地址定位问题&#xff0c;我简单介绍一下它的用法。 使用_at_关键字对存储器进行绝对地址定位程序…

ztree树

常规的ztree树 后台数据封装成list对象 public PageModel getTreeBuildingRegData(Map<String, String> params) {PageModel pageModelnew PageModel();String statusparams.get("status");String orgIdparams.get("org_id");List<OmsBuildingReg…

如何提高效率

如何提高效率 时间管理 April 28th, 2011 本文来自读者 桃雨 翻译投稿。 Aaron Swartz写过一篇很有名的文章&#xff0c;叫做《HOWTO: Be more productive》&#xff08;如何提高效率&#xff09;。这篇文章写的实在是太好了&#xff0c;我看了好多遍&#xff0c;很赞同作者的…

Andrew Ng - 深度学习工程师 - Part 2. 改善深层神经网络:超参数调试、正则化以及优化(Week 1. 机器学习的实用层面)...

第1周 机器学习的实用层面 1.1 训练/开发/测试 早期机器学习时代&#xff08;数据规模较小&#xff09;&#xff0c;如果不需要dev set&#xff0c;常见的划分有 70%/30% 的训练/测试 划分&#xff0c;如果需要验证集&#xff0c;常见的是 60%/20%/20%划分 在big data era&…

jms 如何测试_使用JMSTester对JMS层进行基准测试

jms 如何测试对于我去过的大多数客户端&#xff0c;使用ActiveMQ扩展JMS消息传递层是一个优先事项。 有多种方法可以实现这一目标&#xff0c;但毫无疑问&#xff0c;创建基准并分析实际硬件上的体系结构&#xff08;或者正如我的同事Gary Tully所说的“询问机器”&#xff09;…

为什么待办事项清单不管用

为什么待办事项清单不管用 时间管理 November 22nd, 2012 本文原文来自 Harvard Business Review&#xff0c;由 换装迷宫tayy 翻译。 停止制作你的待办事项清单吧。它们只会让你感觉失败和受挫。想想你正在管理的那些待办清单&#xff1a;有多少事项从年初起就已经在那儿了&…

charts 画饼图

统计某一天某类物体的百分比 新知识点&#xff1a;aggregate https://blog.csdn.net/congcong68/article/details/51619882 主要的 $group $match $sort $limit pipeline [{$group:{_id:$area,count:{$sum:1}}}, # count 是聚合之后新增的一个字段。{$sort:{count:1}}, # …

Apache Camel 2.18 –即将推出的功能的亮点

骆驼骑士正在忙于即将发布的Apache Camel 2.18版本。 当我们动态更新发行说明时 &#xff0c;这是一种快速查看即将发生的情况的方法。 我只是想在夏天在这里进行快速更新&#xff0c;到目前为止&#xff0c;我们已经完成了简短的重点介绍。 随着发行版的临近和文档的完善&…

实时多线程系统的日志实现

实时多线程系统的日志实现 2008-03-21 09:19 黄明/戴颖  软件世界 我要评论(0) 字号&#xff1a;T | T为了分析软件系统在测试和运行期产生的故障&#xff0c;目前大多数软件系统所广泛使用的一种方法就是日志记录。本文给出了利用循环缓冲区和单独的日志读写线程实现实时系统…

51NOD 1424 零树

Discription 有一棵以1为根的树&#xff0c;他有n个结点&#xff0c;用1到n编号。第i号点有一个值vi。 现在可以对树进行如下操作&#xff1a; 步骤1&#xff1a;在树中选一个连通块&#xff0c;这个连通块必须包含1这个结点。 步骤2&#xff1a;然后对这个连通块中所有结点的值…

nosql的数据服务_使用NoSQL实现实体服务–第1部分:概述

nosql的数据服务在过去的几周中&#xff0c;我一直在进行一些研发工作&#xff0c;以了解使用NoSQL数据库实现实体服务 &#xff08;也称为数据服务&#xff09;的优势。 实体服务是Thomas Erl的《服务技术》丛书中提出的服务分类。 它用于描述高度不可知和可重复使用的服务&am…