- 浏览: 1587194 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
nich002:
原网站失效了。撸主简单粗暴的复制过来,可读性极差!差评!
Apache配置详解(最好的APACHE配置教程) -
107x:
不错,谢谢!
LINUX下查看文件夹下的文件个数! -
Hypereo:
好你妹,连个格式都没有!
Apache配置详解(最好的APACHE配置教程) -
resteater:
代码排版感觉有点乱!收发信息代码可读性不强!请问第一次发服务器 ...
java socket例子 -
resteater:
代码排版感觉有点乱!收发信息代码可读性不强!请问第一次发服务器 ...
java socket例子
有限的泛型:<v extends="" number=""></v>
类型通配符:void printList(List l) {}
泛型类实例 java 代码
- public class Lhist<v></v> {
- private V[] array;
- private int size;
- public Lhist(int capacity) {
- array = (V[]) new Object[capacity];
- }
- public void add(V value) {
- if (size == array.length)
- throw new IndexOutOfBoundsException(Integer.toString(size));
- else if (value == null)
- throw new NullPointerException();
- array[size++] = value;
- }
- public void remove(V value) {
- int removalCount = 0;
- for (int i=0; i
- if (array[i].equals(value))
- ++removalCount;
- else if (removalCount > 0) {
- array[i-removalCount] = array[i];
- array[i] = null;
- }
- }
- size -= removalCount;
- }
- public int size() { return size; }
- public V get(int i) {
- if (i >= size)
- throw new IndexOutOfBoundsException(Integer.toString(i));
- return array[i];
- }
- }
评论
4 楼
liudaoru
2007-09-24
extends 的新含意 第 6 页(共9 页)
在 Java 语言引入泛型之前,extends 关键字总是意味着创建一个新的继承自另一个类或接口的类或接口。
引入泛型之后,extends 关键字有了另一个含意。将 extends 用在类型参数的定义中(Collection<T extends Number>)或者通配符类型参数中(Collection<? extends Number>)。
当使用 extends 来指示类型参数限制时,不需要子类-父类关系,只需要子类型-父类型关系。还要记住,有限制类型不需要是该限制的严格子类型;也可以是 该限制。换句话说,对于 Collection<? extends Number>,您可以赋给它 Collection<Number>(尽管 Number 不是 Number 的严格子类型)和 Collection<Integer>、Collection<Long>、Collection<Float> 等等。
在任何这些含意中,extends 右边的类型都可以是参数化类型(Set<V> extends Collection<V>)。
在 Java 语言引入泛型之前,extends 关键字总是意味着创建一个新的继承自另一个类或接口的类或接口。
引入泛型之后,extends 关键字有了另一个含意。将 extends 用在类型参数的定义中(Collection<T extends Number>)或者通配符类型参数中(Collection<? extends Number>)。
当使用 extends 来指示类型参数限制时,不需要子类-父类关系,只需要子类型-父类型关系。还要记住,有限制类型不需要是该限制的严格子类型;也可以是 该限制。换句话说,对于 Collection<? extends Number>,您可以赋给它 Collection<Number>(尽管 Number 不是 Number 的严格子类型)和 Collection<Integer>、Collection<Long>、Collection<Float> 等等。
在任何这些含意中,extends 右边的类型都可以是参数化类型(Set<V> extends Collection<V>)。
3 楼
liudaoru
2007-09-24
类型与类 第 3 页(共9 页)
泛型的引入使得 Java 语言中的类型系统更加复杂。以前,该语言具有两种类型 —— 引用类型和基本类型。对于引用类型,类型 和类 的概念基本上可以互换,术语子类型 和子类 也可以互换。
随着泛型的引入,类型和类之间的关系变得更加复杂。List<Integer> 和 List<Object> 是不同的类型,但是却是相同的类。尽管 Integer 扩展 Object,但是 List<Integer> 不是 List<Object>,并且不能赋给 List<Object> 或者强制转换成 List<Object>。
另一方面,现在有了一个新的古怪的类型叫做 List<?>,它是 List<Integer> 和 List<Object> 的父类。并且有一个更加古怪的 List<? extends Number>。类型层次的结构和形状也变得复杂得多。类型和类不再几乎是相同的东西了。
泛型的引入使得 Java 语言中的类型系统更加复杂。以前,该语言具有两种类型 —— 引用类型和基本类型。对于引用类型,类型 和类 的概念基本上可以互换,术语子类型 和子类 也可以互换。
随着泛型的引入,类型和类之间的关系变得更加复杂。List<Integer> 和 List<Object> 是不同的类型,但是却是相同的类。尽管 Integer 扩展 Object,但是 List<Integer> 不是 List<Object>,并且不能赋给 List<Object> 或者强制转换成 List<Object>。
另一方面,现在有了一个新的古怪的类型叫做 List<?>,它是 List<Integer> 和 List<Object> 的父类。并且有一个更加古怪的 List<? extends Number>。类型层次的结构和形状也变得复杂得多。类型和类不再几乎是相同的东西了。
2 楼
liudaoru
2007-09-24
擦除 第 1 页(共9 页)
也许泛型最具挑战性的方面是擦除(erasure),这是 Java 语言中泛型实现的底层技术。擦除意味着编译器在生成类文件时基本上会抛开参数化类的大量类型信息。编译器用它的强制类型转换生成代码,就像程序员在泛型出现之前手工所做的一样。区别在于,编译器开始已经验证了大量如果没有泛型就不会验证的类型安全约束。
通过擦除实现泛型的含意是很重要的,并且初看也是混乱的。尽管不能将 List<Integer> 赋给 List<Number>,因为它们是不同的类型,但是 List<Integer> 和 List<Number> 类型的变量是相同的类!要明白这一点,请评价下面的代码:
new List<Number>().getClass() == new List<Integer>().getClass()
编译器只为 List 生成一个类。当生成了 List 的字节码时,将很少剩下其类型参数的的跟踪。
当生成泛型类的字节码时,编译器用类型参数的擦除 替换类型参数。对于无限制类型参数(<V>),它的擦除是 Object。对于上限类型参数(<K extends Comparable<K>>),它的擦除是其上限(在本例中是 Comparable)的擦除。对于具有多个限制的类型参数,使用其最左限制的擦除。
如果检查生成的字节码,您无法说出 List<Integer> 和 List<String> 的代码之间的区别。类型限制 T 在字节码中被 T 的上限所取代,该上限一般是 Object。
1 楼
liudaoru
2007-09-24
擦除的含意 第 2 页(共9 页)
擦除有很多初看起来似乎奇怪的含意。例如,因为类只可以实现一个接口一次,所以不能像下面这样定义类:
// invalid definition
class DecimalString implements Comparable<String>, Comparable<Integer> { ... }
由于擦除,上面的声明没有意义。Comparable 的两个实例化是同一个接口,并且它们指定相同的 compareTo() 方法。不能实现一个方法或接口两次。
擦除的另一个更加烦人的含意是,不能使用类型参数实例化一个对象或数组。这意味着您不能在带有类型参数 T 的泛型类中使用 new T() 或 new T[10]。编译器只是不知道生成什么样的字节码。
该问题有几个应急方案,一般涉及反射和类常量(Foo.class)的使用,但是这二者是很麻烦的。Lhist 例子类中的构造函数显示了解决该问题的一种技术(参阅 实现构造函数),toArray() 的讨论(参阅 用 Class<T> 替换 T[])中提供了另一种技术。
擦除的另一个含意是,它使得使用 instanceof 来测试一个引用是不是参数化类型的一个实例是没有意义的。运行时只是不能区分 List<String> 和 List<Number>,所以测试 (x instanceof List<String>) 是没有任何意义的。
类似地,下面的方法不能提高程序的类型安全:
public <T> T naiveCast(T t, Object o) { return (T) o; }
编译器将只是发出一个 unchecked 警告,因为它不能确定强制类型转换是否安全。
擦除有很多初看起来似乎奇怪的含意。例如,因为类只可以实现一个接口一次,所以不能像下面这样定义类:
// invalid definition
class DecimalString implements Comparable<String>, Comparable<Integer> { ... }
由于擦除,上面的声明没有意义。Comparable 的两个实例化是同一个接口,并且它们指定相同的 compareTo() 方法。不能实现一个方法或接口两次。
擦除的另一个更加烦人的含意是,不能使用类型参数实例化一个对象或数组。这意味着您不能在带有类型参数 T 的泛型类中使用 new T() 或 new T[10]。编译器只是不知道生成什么样的字节码。
该问题有几个应急方案,一般涉及反射和类常量(Foo.class)的使用,但是这二者是很麻烦的。Lhist 例子类中的构造函数显示了解决该问题的一种技术(参阅 实现构造函数),toArray() 的讨论(参阅 用 Class<T> 替换 T[])中提供了另一种技术。
擦除的另一个含意是,它使得使用 instanceof 来测试一个引用是不是参数化类型的一个实例是没有意义的。运行时只是不能区分 List<String> 和 List<Number>,所以测试 (x instanceof List<String>) 是没有任何意义的。
类似地,下面的方法不能提高程序的类型安全:
public <T> T naiveCast(T t, Object o) { return (T) o; }
编译器将只是发出一个 unchecked 警告,因为它不能确定强制类型转换是否安全。
发表评论
-
JVM问题追查与调优
2012-03-27 14:44 1166JDK的几种分析工具 http://liudaoru ... -
NodeJs相关资料
2011-08-18 14:55 3057NodeJs获取参数: proces ... -
jprofiler追踪问题
2011-08-12 18:20 1077Jprofiler下载页: http://www.ej ... -
Linux服务器性能评估与优化【z】
2011-07-01 10:05 1584来自:http://www.itlearner.com/ ... -
Java 理论与实践: 非阻塞算法简介【z】
2011-03-26 20:39 1318From: http://www.ibm.com/develo ... -
Java Crash问题分析[z]
2011-03-23 14:41 6002参考: http://www.ibm.com/develop ... -
Berkeley DB相关
2010-09-25 22:17 1073为什么要使用Berkeley DB,它适合什么场合应用?Ber ... -
熟悉系统方法总结
2010-07-06 14:26 846了解一个陌生的系统是我们经常碰到的事情,下面总结一下自己的一些 ... -
Java缓存框架 EhCache
2010-07-06 14:09 4750From: http://www.oschina.net/p/ ... -
【nio】使用 ServerSocketChannel 实现的 File 服务器[z]
2010-05-21 17:31 4009From: http://www.java2000.net/p ... -
Memcached命令行管理
2010-03-15 11:18 4522From: http://www.exp2up.com/2 ... -
(转)Resin服务器配置指南
2010-01-21 15:35 3525From:http://blog.21cn.com/super ... -
Flickr架构
2010-01-11 09:52 1282From: http://www.cyask.com/ques ... -
JDK的几种分析工具
2009-12-04 12:13 10925From: http://blog.csdn.net/hant ... -
XMemcached——一个新的开源Java memcached客户端
2009-10-23 09:27 1911From: http://www.infoq.com/cn/ ... -
多线程任务调度学习
2009-10-16 13:58 2325昨天找到一套多线程任务调度的代码,相当的不错,先把思路总结一下 ... -
用HSCALE实现MySQL的数据分布式存储
2009-10-15 12:47 3035From:http://www.ningoo.net/ht ... -
马化腾:搜索、电子商务硬仗一定要坚持打
2009-10-15 12:09 1747From:http://www.techweb.com.c ... -
MySQL分表实现上百万上千万记录分布存储的批量查询设计模式【z】
2009-10-15 09:56 3196From:http://hi.baidu.com/jabber ... -
nginx负载均衡和lvs负载均衡的比较分析【z】
2009-10-13 20:02 1503From:http://www.shouker.com/u ...
相关推荐
这些“java泛型学习全面页面下载资料”很可能包含以下内容: 1. **泛型的基本概念**:解释了泛型是什么,以及如何通过使用尖括号`<>`来定义泛型类、泛型接口和泛型方法。 2. **类型参数**:介绍如何定义类型参数,...
"Java 泛型学习" Java 泛型是 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的...
泛型学习和泛型接口和泛型经典示例
这篇“Delphi 泛型学习实录”将深入探讨这一主题。 首先,我们要理解什么是泛型。泛型是一种模板或类蓝图,它在编译时并不绑定到特定的数据类型,而是等到运行时或实际使用时才确定。这样做的好处在于,泛型可以...
C#泛型是.NET框架中的一个强大特性,它允许开发者创建可重用...在“泛型学习”这个压缩包文件中,可能包含了各种C#泛型的实例代码,通过这些实例,你可以深入学习和实践泛型的使用,从而更好地掌握这一强大的编程工具。
泛型学习笔记2的源代码,泛型 : 要解决类型的安全问题, 如果使用Object类型会带来类型的损失。典型的应用就是在集合中, 集合中理论上可以保存任意对象,实际上我们应该让它泛型化,集合类<元素类型>, 添加元素...
### Java泛型学习知识点 #### 一、泛型的基本概念及意义 - **引入背景**:JDK 5.0 引入了泛型的概念,这是为了提高 Java 的类型安全性而进行的重要改进。泛型使得程序员能够在编程时指定类型参数,从而避免运行时...
C#泛型是.NET框架中的一个强大特性,它允许我们创建可重用的类型,这些类型可以在多种数据类型上工作,而无需重复编写相同代码。泛型的主要目标是提高代码的类型安全性和性能,同时减少类型转换的需要。在本文中,...
最近频繁的接触到泛型方面的问题,所以也不得不来学习一下了,开始主要是在MSDN的WebCast上去下载教学录象看的(李建忠老师的),本篇文章先介绍一下泛型入门方面的知识,希望能让刚开始学习泛型的朋友能够更快的入门, ...
黑马程序员提供的这篇关于泛型的学习注意点,结合了源码分析和工具应用,旨在帮助开发者深入理解并有效运用泛型。下面将详细阐述泛型的主要知识点: 1. 泛型的基本概念: 泛型是Java SE 5.0引入的新特性,主要用于...
总结,Java基础泛型的学习涵盖了类型参数、泛型类、方法和接口,以及边界、类型擦除、多态和集合的使用等多个方面。理解并熟练运用泛型,可以显著提升代码的质量和可维护性。在实际开发中,特别是在处理数据结构如...
Java泛型是Java编程语言中的一个特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的重用性和安全性。泛型的主要目的是在编译时进行类型检查,防止在运行时出现ClassCastException这样的类型转换异常。...
学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...
java 泛型学习,自己看看,有意者看看,学习学习,交流一下,如果有什么意见一起商讨下,相互进步。
Java泛型是Java编程语言中的一个特性,它允许在定义类、接口和方法时使用类型参数,从而增强了代码的重用性、安全性和效率。在Java中,泛型的引入是为了提供编译时类型安全检查,并减少在运行时进行类型转换的需要。...
### C#泛型详解 #### 一、为什么使用泛型? 在C#编程过程中,我们经常会遇到这样的场景:需要编写类似的功能,但是处理的数据类型各不相同。例如,可能需要编写一个栈(Stack)结构来处理整数(int),另一个栈来...
思维导图