摘要: java 泛型的残酷现实就是:在泛型代码内部,无法获得任何有关泛型参数类型的信息。在使用泛型时,任何具体的类型都被擦除,唯一知道的是你在使用一个对象。比如:List<String>和List<Integer>在运行事实上是相同的类型。他们都被擦除成他们的原生类型,即List。snippet1: 1 package com.cognizant.ch15; 2 3 import java.lang.reflect.Array; 4 import java.util.Arrays; 5 6 public class ArrayMaker<T> { 7 privat 阅读全文
posted @ 2012-09-21 18:35 曾先森在努力 阅读(722) 评论(0) 推荐(0) 编辑
摘要: 这其中涉及Java泛型的实现机制和泛型擦除问题,详见下面文章。一、概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变),奇怪的ClassCastException等。 正确的使用Java泛型需要深入的了解Java的一些概念,如协变,桥接方法,以及这篇笔记记录的类型擦除。Java泛型的处理几乎都在编译器中进行,编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。二、编译器如何处理泛型? 通常情况下,一个 阅读全文
posted @ 2012-09-21 18:23 曾先森在努力 阅读(418) 评论(0) 推荐(0) 编辑
摘要: 我想这个问题的答案是:因为这样做会破坏类型安全。核心的问题在于Java范型和C#范型存在根本区别:Java的范型停留在编译这一层,到了运行时,这些范型的信息其实是被抹掉的;而C#的范型做到了MSIL这一层。Java的做法不必修改JVM,减少了潜在的大幅改动和随之而来的风险,也许同时也反映出Java Bytecode规范在设计之初的先天不足;C#则大刀阔斧,连CLR一起改以支持更彻底的范型,换句话说,在范型这一点上,感觉C#更C++一点。在Java中,Object[]数组可以是任何数组的父类,或者说,任何一个数组都可以向上转型成它在定义时指定元素类型的父类的数组,这个时候如果我们往里面放不同于原 阅读全文
posted @ 2012-09-21 17:56 曾先森在努力 阅读(293) 评论(0) 推荐(0) 编辑
摘要: List对象排序通用方法在数据库中查出来的列表中,往往需要对不同的字段重新排序,一般的做法都是使用排序的字段,重新到数据库中查询。如果不到数据库查询,直接在第一次查出来的list中排序,无疑会提高系统的性能。只要把第一次查出来的结果存放在session中,就可以对list重新排序了。一般对list排序可以使用Collections.sort(list),但如果list中包含是一个对象的话,这种方法还是行不通的。如果有下面这个对象:这是一个简单的数据对象,现在要对 1 //UserInfo.java 2 package test; 3 4 import java.text.SimpleDate. 阅读全文
posted @ 2012-09-21 17:45 曾先森在努力 阅读(1706) 评论(1) 推荐(0) 编辑
摘要: 转自web-software什么是泛型?泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象。因为 Map.get() 被定义为返回 Object,所以一般必须将 Map.get() 的结果强制 阅读全文
posted @ 2012-09-21 17:43 曾先森在努力 阅读(171) 评论(0) 推荐(0) 编辑
摘要: Java泛型简明教程泛型是Java SE 5.0中引入的一项特征,自从这项语言特征出现多年来,我相信,几乎所有的Java程序员不仅听说过,而且使用过它。关于Java泛型的教程,免费的,不免费的,有很多。我遇到的最好的教材有:The Java TutorialJava Generics and Collections, by Maurice Naftalin and Philip WadlerEffective Java中文版(第2版), by Joshua Bloch.尽管有这么多丰富的资料,有时我感觉,有很多的程序员仍然不太明白Java泛型的功用和意义。这就是为什么我想使用一种最简单的形式来 阅读全文
posted @ 2012-09-21 17:39 曾先森在努力 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 表面上看起来,无论语法还是应用的环境(比如容器类),泛型类型(或者泛型)都类似于 C++ 中的模板。但是这种相似性仅限于表面,Java 语言中的泛型基本上完全在编译器中实现,由编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码。这种实现技术称为 擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除),这项技术有一些奇怪,并且有时会带来一些令人迷惑的后果。虽然范型是 Java 类走向类型安全的一大步,但是在学习使用泛型的过程中几乎肯定会遇到头痛(有时候让人无法忍受)的问题。注意:本文假设您对 JDK 5.0 中的范型有基本的了解。泛型不是协变的虽然将集 阅读全文
posted @ 2012-09-21 17:37 曾先森在努力 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 普通泛型 1 class Point<T>{ // 此处可以随便写标识符号,T是type的简称 2 private T var ; // var的类型由T指定,即:由外部指定 3 public T getVar(){ // 返回值的类型由外部决定 4 return var ; 5 } 6 public void setVar(T var){ // 设置的类型也由外部决定 7 this.var = var ; 8 } 9 };10 public class GenericsDemo06{11 ... 阅读全文
posted @ 2012-09-21 17:33 曾先森在努力 阅读(297) 评论(0) 推荐(0) 编辑
摘要: java泛型是用擦除实现的,即在编译时把类型信息变为object,然后运行是再动态确定类型信息。 1 //简单的泛型 2 class Test<T> 3 { 4 private T e; 5 public void set(T e){ 6 this.e = e; 7 } 8 public void print(){ 9 System.out.println(e);10 }11 }反编译后: 1 class Test 2 { 3 4 Test() 5 { 6 } 7 8 public vo... 阅读全文
posted @ 2012-09-21 17:29 曾先森在努力 阅读(355) 评论(0) 推荐(0) 编辑