java泛型程序设计——类型变量限定 + 泛型代码和虚拟机

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 类型变量限定 + 泛型代码和虚拟机 的知识;


【1】类型变量的限定

1.1)类和方法需要对类型变量加以限定

  • 1.1.1)看个荔枝:
class ArrayAlg
{public static <T> T min(T[] a){if(a == null || a.length==0) return null;T smallest = a[0];for(int i=1;i<a.length;i++)if(smallest.compareTo(a[i]) > 0) smallest = a[i];return smallest;}
}

对以上代码的分析(Analysis):

  • A1)出现的问题:变量smallest 的类型为 T ,意味着它可以是任何一个类的对象。怎么才能确定T 所属的类有 compareTo 方法呢?
  • A2)解决方法:将T 限制为 实现了 Comparable 接口(只含有一个compareTo的标准接口)的类。 可以通过对类型变量T设置限定实现这一点:
public staitc <T extends Comparable> T min(T[] a);
  • 现在, 泛型的main方法只能被实现了 Comparable 接口的类(如 String, Date 等)的数组调用。 由于 Rectangle 类没有实现 Comparable接口, 所以调用min 方法将会产生一个编译错误;

A3)读者奇怪: 为什么使用关键字extends 而不是 implemens , 因为Comparable是一个接口。
A3.1)看个荔枝: 表示T 应该是绑定类型的子类型。T 和 绑定类型可以是类, 也可以是接口。 选择关
键字extends 的原因是更接近子类的概念, 并且 java 的设计者也不打算在语言中再添加一个新的 关键字;
1.2)一个类型变量或通配符可以有多个限定, 如

T extends Comparable & Serializable 限定类型用 & 分割, 而逗号用来分割类型变量;

1.3)在java继承中, 可以根据需要拥有多个接口超类型, 但限定中至多有一个类。 如果用一个类作为限定, 它必 须是限定列表中的第一个;
1.4)看个荔枝:


【2】泛型代码和虚拟机

2.1)虚拟机没有泛型类对象——所有对象都属于普通类;

  • 2.1.1)原始类型:无论何时定义一个泛型类型, 都自动提供了一个相应的 原始类型。 原始类型的名字就是删去类型参数后的泛型类型名。
  • 2.1.2)擦除操作: 擦除类型变量, 并替换为 限定类型(无限定的变量用 Object, 如只有T,没有 T extends Comparable 的限定类型);
  • 2.1.3)看个荔枝: Pair(下图中的代码) 的原始类型(下面的源代码)如下,
    这里写图片描述
public class Pair
{private Object first;private Object second;public Pair() { first = null; second = null; }public Pair(Object first, Object second) { this.first = first;  this.second = second; }public Object getFirst() { return first; }public Object getSecond() { return second; }public void setFirst(Object newValue) { first = newValue; }public void setSecond(Object newValue) { second = newValue; }
}

对以上代码的分析(Analysis):

  • A1)因为T是一个无限定的变量,所以直接用 Object 替换;
  • A2)在程序中可以包含不同类型的 Pair ,如 Pair, Pair , 而擦除类型后就变成原始的Pair 类型了;

2.2)原始类型用第一个限定的类型变量来替换, 如果没有给定限定就用 Object替换。

  • 2.2.1)没有限定类型: 如上述荔枝中的 Pair 没有类型变量没有限定(没有 T extends … 语句), 因此,原始类型用 Object 替换T;
  • 2.2.2)但是如果T有限定的话: 如 T extends Comparable & Serializable , 看个荔枝:
 public class Interval<T extends Comparable & Serializable> implements Serializable
{private T lower;private T upper;public Interval(T first, T second){}
}
  • 原始类型 Interval 如下所示:
public class Interval implements Serializable
{private Comparable  lower;private Comparable  upper;public Interval(Comparable  first, Comparable  second){}
}

Annotation)

  • A1)如果切换限定:class Interval 《Serializable & Comparalbe> 会发生什么?
  • A2)如果这样做 : 原始类型用 Serializable 替换T , 而编译器在必要时要向 Comparable 插入强制类型转换。
  • A3)为了提高效率: 应该将标签(tagging) 接口(即没有方法的接口)放在边界列表的末尾;

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

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

相关文章

java中装饰器_Java设计模式12:装饰器模式

装饰器模式装饰器模式又称为包装(Wrapper)模式。装饰器模式以多客户端透明的方式扩展对象的功能&#xff0c;是继承关系的一个替代方案。装饰器模式的结构通常给对象添加功能&#xff0c;要么直接修改对象添加相应的功能&#xff0c;要么派生子类来扩展&#xff0c;抑或是使用对…

selenium 4_Selenium4 Alpha –期望什么?

selenium 4Selenium4 Alpha-期望什么&#xff1f; 早在2018年8月&#xff0c;整个测试自动化社区就受到了一个重大新闻的打击&#xff1a;Selenium的创始成员Simon Stewart在班加罗尔Selenium会议上正式确认了Selenium 4的发布日期和一些重大更新。 世界最受欢迎的Web测试自动化…

英文论文中“such as, for example, e.g., i.e., etc., et al. ”的用法分析

【1】README 本文转自&#xff1a; http://www.cnblogs.com/lanke_2009/archive/2010/12/07/1899185.html &#xff0c; 旨在学习 英文论文中的 如 “such as, for example, e.g., i.e., etc., et al. ”的用法&#xff1b; 【2】正文如下&#xff1a; 黄龙旺  龚汉忠 (上…

mysql8.0云时代_8.0.22Mysql的详细安装

Mysql8.0.22的安装和常见问题前言提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考一、MySQL的下载和安装&#xff1f;1.mysql官网下载&#xff1a;https://dev.mysql.com/downloads/mysql/2.下载步骤&#xff1a;可以点击Go to download page 去下载32位的…

java泛型程序设计——翻译泛型表达式+翻译泛型方法

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java泛型程序设计 的 翻译泛型表达式翻译泛型方法 的知识&#xff1b; 【1】翻译泛型表达式 1.1&#xff09;当程序调用泛型方法时&#xff0c; 如果擦除了泛型返回类型&#xf…

redis 受攻击怎么办?_最受欢迎的6个最常用的Redis库

redis 受攻击怎么办?Redis当前是世界上最受欢迎的键值商店&#xff0c; 它通过提供高速度和低延迟以及针对应用程序开发人员的灵活功能集&#xff0c;赢得了广泛的采用率 。 Redis是一个内存中的数据结构存储&#xff0c;用作根据BSD许可分发的数据库&#xff0c;缓存和消息代…

java泛型程序设计——调用遗留代码

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java泛型程序设计 的 调用遗留代码 的知识&#xff1b; 【1】调用遗留代码相关 1.1&#xff09;设计java 泛型的目的&#xff1a; 允许泛型代码和遗留代码间能够相互操作&#…

java oracle 字符_Oracle转义字符

1、oracle 特殊字符 转义关键词&#xff1a; oracle 转义环境&#xff1a;oracle 9i plsql在plsql里边执行:update userinfo set pageurlmyjsp?page1&pagesize10 where idtest这条sql语句往数据库的pageurl字段放进去了一个url地址&#xff0c;但是执行的时候却并非那…

jmeter进行性能测试_使用JMeter进行性能测试

jmeter进行性能测试在开发复杂的高可用性软件项目时&#xff0c;性能至关重要。 在当今这样的时代尤其如此&#xff0c;除了闪电般的实时数据可访问性之外&#xff0c;其他任何事情都受到惩罚。 当谈论有时需要的大量数据时&#xff0c;这并非总是一件容易的事。 在本文中&…

java泛型程序设计——约束与局限性

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java泛型程序设计 的 约束与局限性 的知识&#xff1b; 【1】 不能用基本类型实例化类型参数 1.1&#xff09;不能用类型参数代替基本类型&#xff0c; 因此&#xff0c;没有 Pa…

python简单菜单_创建一个简单的python菜单

修正和评论&#xff0c;它们主要是语法错误。menulist 1. Print the list,2. Add a name to the list,3. Remove a name from the list,4. Change an item in the list,9. Quit #assuming you want to display menulist, having it as a tuple is uselesslst("johny"…

郎溪 溪流_到无限(溪流)和超越!

郎溪 溪流Java允许您处理集合或流中的数据。 将流视为将一个集合转换为另一个集合的技术非常容易。 这可能会导致一些相当随意的代码&#xff0c;其中流数据被重复收集到某种类型的集合中&#xff0c;作为一个整体集合传递&#xff0c;然后再进行更多处理。 对于6个元素&#…

java泛型程序设计——Varargs 警告+不能实例化类型变量

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java泛型程序设计 的 Varargs 警告不能实例化类型变量 的知识&#xff1b; 【1】 Varargs 警告 1.1&#xff09;一个相关问题&#xff1a; 向参数个数可变的方法传递一个泛型类型…

rabbitmq怎么停止_Windows环境下RabbitMQ的启动和停止命令

Windows环境下RabbitMQ的启动和停止命令原创lockie_zou 最后发布于2018-05-24 15:34:21 阅读数 36514 收藏展开首先windows下安装好了erlang和rabbitmq。如下地址同时下载和安装&#xff1a;Erlang&#xff1a;http://www.erlang.org/download.htmlRabbitMQ &#xff1a;http:…

elk入门_ELK堆栈入门

elk入门朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证&#xff0c;管理和保护。 好的设计原则要求微服务架构是可观察的&#xff0c;并提供集中的监视工具。 该工具使开…

java泛型程序设计——泛型类的静态上下文中类型变量无效+不能抛出或捕获泛型类的实例

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java泛型程序设计 的 泛型类的静态上下文中类型变量无效不能抛出或捕获泛型类的实例 的知识&#xff1b; 【1】泛型类的静态上下文中类型变量无效 1.1&#xff09;不能在静态域或…

android ril.java_Android RIL学习

1.Android RIL概念Android RIL是基于telephony服务和raido硬件层的抽象层。Android的rild库是介于HAL接口与baseband modem之间&#xff0c;它提供了语音、数据、短信、SIM卡管理以及STK应用的功能。它把标准的GSM27.007中常用的如dial这些做主动请求的操作称之为request&#…

netty java_Netty Java快速指南

netty java使用Okta的身份管理平台轻松部署您的应用程序 使用Okta的API在几分钟之内即可对任何应用程序中的用户进行身份验证&#xff0c;管理和保护。 今天尝试Okta。 Netty是一个无阻塞输入/输出&#xff08;NIO&#xff09;框架&#xff0c;它使开发低级网络服务器和客户端…

java泛型程序设计——注意擦除后的冲突

【0】README 0.1&#xff09; 本文描述源代码均 转自 core java volume 1&#xff0c; 旨在理解 java泛型程序设计 的 注意擦除后的冲突 的知识&#xff1b; 1.1&#xff09;当泛型类型被 擦除时&#xff0c; 无法创建引发冲突的条件。 1.1.1&#xff09;看个荔枝&#xff…

java的Swing里怎么new一条线_java – 在JFrame上绘制一条线

我正在尝试使用图形2D绘制一条线,但然后该线出现在所有的线上JFrame中的其他组件因此使它们不可见.我该如何解决这个问题&#xff1f;这是代码&#xff1a;import javax.swing.*;import java.awt.*;import java.awt.geom.*;class Success extends JFrame{public Success(){JPan…