目录
Java编程思想(一)第1~4章:概述
Java编程思想(二)第5章:初始化和清理
Java编程思想(三)第6章:访问权限
Java编程思想(四)第7章:复用类
Java编程思想(五)第8章:多态
Java编程思想(六)第9章:接口
Java编程思想(七)第10章:内部类
Java编程思想(八)第11章:持有对象
Java编程思想(九)第12章:异常
Java编程思想(十)第13章:字符串
Java编程思想(十一)第14章:类型信息
Java编程思想(十二)第15章:泛型
Java编程思想(十三)第16章:数组
Java编程思想(十四)第17章:深入研究容器
Java编程思想(十五)第18章:Java I/O系统
Java编程思想(十六)第19章:枚举
Java编程思想(十七)第20章:注解
Java编程思想(十八)第21章:并发
第十五章、泛型
泛型(generics)的概念是Java SE5的重大变化之一。泛型实现了参数化类型(parameterized types)的概念,使代码可以应用于多种类型。“泛型”这个术语的意思是:“适用于许多许多的类型”。
目录
1.与c++的比较
2.简单泛型(泛型类)
3.泛型接口
4.泛型方法
5.匿名内部类
6.构建复杂模型
7.擦除的神秘之处
8.擦除的补偿
9.边界
10. 泛型问题
11. 自限定类型
12. 动态类型安全
13. 异常
14. 混型
15. 将函数对象用作策略
c++的模板、Java泛型的边界
与其使用Object我们更喜欢暂时不指定类型,而是稍后再决定具体使用什么类型。要达到这个目的,要使用类型参数
public class Holder {
private T a;
public Holder(T a) {this.a = a;}
public void set(T a) {this.a = a;}
public T get() {return a;}
}
2.1 一个元祖类库
2.2 一个堆栈类
链表节点-泛型-嵌套类实现:
private static class Node {
U item;
Node next;
Node() {}
Node(U item, Node next) {
this.item = item;
this.next = next;
}
public boolean end() {return item==null && next ==null;}
}
2.3 RandomList
public interface Generator {
T next();
}
举例:
方法参数为泛型:public
方法返回值为泛型:public
4.1 杠杆利用类型参数推断
public class Demo{
public static Map map(){
return new HashMap();
}
}
func(Demo.>map()); //显式的类型说明--用法!
4.2 可变参数与泛型方法
eg: public static
4.3 用于Generator的泛型方法
public interface Generator {
T next();
}
public class Generators {
public static Collection fill(Collection coll, Generator gen, int n) {
for(int i = 0; i < n; i ++)
coll.add(gen.next());
return coll;
}
}
4.4 一个通用的Generator
public class BasicGenerator implements Generator {
private Class type; //Class对象
public BasicGenerator(Class type) {
this.type = type;
}
@override
public T next() {
try {
return type.newInstance();//通过Class对象生成实例Instance
} catch(Exception e) {
throw new RuntimeException(e);
}
}
public static Generator create(Class type) {
return new BasicGenerator(type);
}
}
4.5 简化元组的使用
4.6 一个Set实用工具
public interface Generator {
T next();
}
public static Generator generator(){
return new Generator{ //泛型类创建对象时,必须指明类型
public Customer next(){ return new Customer();} //泛型方法调用时,自动类型推断
}
}
7.2 迁移兼容性。
eg: 类型参数的擦除:
7.3 擦除的问题
7.4 边界处的动作
public class ArrayMaker{
private Class kind; //会被类型擦除为Class对象
public ArraryMake(Class kind){this.kind = kind;}
public T[] create(int size){
return (T()) Array.newInstance(kind,size); //推荐使用此方式,借助Kind Class对象创建数组
}
}
ArrayMaker stringMaker = new ArrayMaker(String.class);
String[] strArray = stringMaker.create(10);
public class Erased {
private final int SIZE = 100;
public static void f(Object arg) {
if(arg instanceof T) { //ERROR,可改为Class对象isInstance()
T var = new T(); //ERROR,可改为Class对象newInstance()
T[] array = new T[SIZE]; //ERROR,可改为使用new ArrayList()
T[] array = (T)new Object[SIZE]; //unchecked warning
}
}
}
public class ClassObject {
Class kind;
public boolean f(Object arg) {
return kind.isInstance(arg); //擦除补偿的用法举例
}
}
class SelfBounded>{
T element;
SelfBounded set(T tag){
element = tag;
return this;
}
T getElement(){
return element;
}
}
class A extends SelfBounded{} //自限定:类型参数&定义类必须一致
A a = new A();
a.set(new A()); //参数协变:方法参数&定义的子类 可以保持动态一致。
interface Combiner{
T combine(T x, T y); //策略模式:
}
class StrCombiner{ //函数对象:
String combine(String x, String y){ return x+ y;}
}