- 浏览: 465477 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
泛型的好处是在编译的时候检查类型安全,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
泛型小结将从如下几个方面入手: 通配符号的使用将放入下一篇博文中介绍。
泛型修饰的范围
java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
a) 泛型接口的例子
b) 泛型类的例子
c) 泛型方法的语法
[访问权限修饰符][static][final]<类型参数列表>返回值类型 方法名([形式参数列表])
其中,[]内的内容是可选的。
下面举几个Collections工具类中的几个泛型方法例子:
使用&实现多重限制
如果一个类型有多余一个的限制条件,可以使用&实现多重限制
类型擦除
类型擦除(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。
比如:
这段代码无法编译通过。
在编译后泛型类型是会被擦除的,在这个重载的例子中,因为参数List<Integer>和 List<String>编译之后都被擦除了,变成了一样的原生类型List<E>,擦除动作导致这两个方法的特征签名一样,这样两个相同的方法将不能满足重载,最后导致编译失败。
在编译后所有的泛型类型都会做相应的转化:
泛型的好处是在编译的时候检查类型安全,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
泛型小结将从如下几个方面入手: 通配符号的使用将放入下一篇博文中介绍。
- 泛型的修饰范围
- 使用&实现多重限制
- 类型擦除
- <? super T>, <? extends T>, <?>通配符的使用
泛型修饰的范围
java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
a) 泛型接口的例子
public interface List<E> extends Collection<E> { ... Iterator<E> iterator(); boolean add(E e); boolean addAll(Collection<? extends E> c); ... }
b) 泛型类的例子
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { ... public Iterator<E> iterator() { return new Itr(); } public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } ... public boolean addAll(Collection<? extends E> c) { Object[] a = c.toArray(); int numNew = a.length; ensureCapacityInternal(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew; return numNew != 0; } ... }
c) 泛型方法的语法
[访问权限修饰符][static][final]<类型参数列表>返回值类型 方法名([形式参数列表])
其中,[]内的内容是可选的。
下面举几个Collections工具类中的几个泛型方法例子:
public static <T> void sort(List<T> list, Comparator<? super T> c) { Object[] a = list.toArray(); Arrays.sort(a, (Comparator)c); ListIterator i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set(a[j]); } }
public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); ListIterator<T> i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set((T)a[j]); } }
public static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp) { if (comp==null) return (T)min((Collection<SelfComparable>) (Collection) coll); Iterator<? extends T> i = coll.iterator(); T candidate = i.next(); while(i.hasNext()) { T next = i.next(); if (comp.compare(next, candidate) < 0) candidate = next; } return candidate; }
使用&实现多重限制
如果一个类型有多余一个的限制条件,可以使用&实现多重限制
public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) { Iterator<? extends T> i = coll.iterator(); T candidate = i.next(); while (i.hasNext()) { T next = i.next(); if (next.compareTo(candidate) < 0) candidate = next; } return candidate; }
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) { Iterator<? extends T> i = coll.iterator(); T candidate = i.next(); while (i.hasNext()) { T next = i.next(); if (next.compareTo(candidate) > 0) candidate = next; } return candidate; }
类型擦除
类型擦除(type erasure)。 Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。
比如:
import java.util.List; public class TypeErasureTest { public void test(List<String> ls) { System.out .println("Mthod test(List<String> ls) is calling."); } public void test(List<Integer> ls) { System.out.println("Mthod test(List<Integer> ls) is calling."); } }
这段代码无法编译通过。
在编译后泛型类型是会被擦除的,在这个重载的例子中,因为参数List<Integer>和 List<String>编译之后都被擦除了,变成了一样的原生类型List<E>,擦除动作导致这两个方法的特征签名一样,这样两个相同的方法将不能满足重载,最后导致编译失败。
在编译后所有的泛型类型都会做相应的转化:
- List<String>, List<Integer>, List<T>擦除后的类型为List
- List<String>[] 擦除后的类型为List[]
- List<? extends E>, List<? super E> 擦除后的类型为List<E>
- List<T extends Serialiable & Clonable> 擦除后为List<Serialiable>
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 897面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6725本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2210本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1736尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2722本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2163正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3741本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1953问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3976题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3169题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8745EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3323题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6698面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9844Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1413个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2141从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7390for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4128本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2898本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
4. 小结 在本文中,我们讨论了Java中的泛型构造函数,包括非泛型类中的泛型构造函数和泛型类中的泛型构造函数。我们也学习了如何使用泛型构造函数来创建对象。在实际开发中,泛型构造函数可以帮助我们编写更加灵活...
java--4.1 应用场景4.2 相关知识4.3 实施过程4.4 拓展知识4.5 拓展训练4.6 课后小结4.7 课后习题4.8 上机实训
### Java个人学习小结 #### Java发展史及重要里程碑 - **起源与发展**: Java 的起源可以追溯到 1992 年,当时的 Sun Microsystems 公司开发了一种名为 Oak 的编程语言,最初是为了家用电器的智能化而设计的。然而...
在Java泛型编程中,extends和super关键字用于限制类型参数的范围。PECS原则是一个重要的原则,用于指导泛型编程。了解extends和super关键字的区别,并遵循PECS原则,可以帮助你编写更好的泛型代码。
**10.1.5 枚举小结** - 枚举是一种引用类型,因为它隐式继承自`java.lang.Enum`类。 - 枚举是JDK 5.0之后新增的特性,使用并不频繁。 - 枚举值是常量,具有默认的`public static final`修饰符。 - 使用枚举类型的...
本文档“JAVA程序:接口小结”很可能是对Java接口的全面总结,包含了相关的代码示例,帮助学习者深入理解和运用接口。 接口在Java中的主要特性包括: 1. **接口是完全抽象的**:接口中的所有方法默认都是抽象的,...
DOM解析器会将整个XML文件加载到内存中,形成一个树形结构,适合处理小到中等规模的XML文档。而SAX解析器采用事件驱动的方式,逐行读取XML文件,适合处理大型XML文件以避免内存消耗。 对于多级XML,DOM解析更便于...
1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装集成开发环境 20 2.1.1 集成开发环境有哪些 20 2.1.2 安装Eclipse 21 2.2 Eclipse...
本文将深入探讨这两个语言的核心概念,以及它们在实际开发中的应用,同时也会涉及Spring框架,一个在Java生态系统中至关重要的组件。 首先,Java是一种跨平台的面向对象的编程语言,由Sun Microsystems(后被Oracle...
1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装集成开发环境 20 2.1.1 集成开发环境有哪些 20 2.1.2 安装Eclipse 21 2.2 Eclipse...
1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种基本结构 25 2.1.3 面向对象程序设计简介 27 2.1.4 面向对象的基本特征 28 2.2 UML...
**实验小结:** - 加深了对类的理解。 - 学会了内部类的声明与使用技巧。 - 理解了玩家间的轮转逻辑优化。 --- #### 实验二:输入输出流的应用 **实验目的:** - 掌握文件读写的Java API。 - 学习文本处理及异常...
Java 集合框架 Java 集合框架是一个强大的框架,提供了...小结 Java 集合框架是一个强大且灵活的框架,提供了丰富的集合类和接口,以方便开发者处理数据。它是 Java 语言的核心组件之一,广泛应用于各种应用程序中。
### 小结 通过系统地学习上述书籍,Java初学者将能够建立起全面而深入的知识体系。这些书籍不仅仅是理论知识的堆砌,更重要的是提供了大量实用的代码示例和案例分析,有助于读者更好地理解和掌握Java语言的特点。...
Java反射机制是Java编程语言中一个强大的工具,它允许程序在运行时动态地获取类的信息并操作类的对象。反射机制的核心在于java.lang.reflect包中的API,主要包括Class类、Constructor类、Method类和Field类。以下是...
+ 和 += 3.14 使用操作符时常犯的错误 3.15 类型转换操作符 3.15.1 截尾和舍入 3.15.2提升 3.16 Java没有“sizeof” 3.17 操作符小结 3.18 总结 第4章 控制执行流程 4.1 true和false 4.2 if-else 4.3 迭代 4.3.1 do-...
以上内容只是Java面向对象编程的一小部分,马士兵教授的教程会更深入地探讨这些概念,并结合实例进行讲解,帮助开发者更好地理解和应用面向对象技术。通过学习和实践,你可以掌握创建高效、可维护的Java应用程序的...
Java51.4.1 使用Object表示泛型1.4.2 基本类型的包装1.4.3 使用接口类型表示泛型1.4.4 数组类型的兼容性1.5 利用Java5泛性实现泛型特性成分1.5.1 简单的泛型类和接口1.5.2 自动装箱/拆箱1.5.3 带有限制的通配符...
(七) 小结 Java简化了C++的许多复杂性,适合快速开发,但C++的性能和灵活性使其在需要底层控制的场景中更胜一筹。Java的跨平台能力也是其一大优势,而C++更依赖于特定的硬件和操作系统。 总之,Java和C++各有优缺点...