泛型记录概要
泛型出现重要原因之一:创造容器类
泛型主要目的之一:指定容器持有什么类型的对象,保证编译的正确性
泛型简单实例
class GenericsClass<T>{
private T property;
public GenericsClass(T property){}
}
元组(tuple)
基本概念
又称数据传送对象或者信使。将一组对象直接打包存储于其中的一个单一对象,只允许往这个对象读取其中元素,但是不允许向其中存放新的对象
目的
解决仅一次方法调用返回多个对象
特性
具有任意长度存在不同类型的对象
简单二维元组
class TwoTuple<L,R>{
public final L left;
public final R right;
public TwoTuple(L left,R right){
this.left = left;
this.right = right;
}
public String toString(){
return "(" + left + "," + right + ")";
}
}
通过继承机制创建长度更长的元组
class ThreeTuple<L,M,R> extends TwoTuple<L,R>{
public final M middle;
public TwoTuple(L left,M middle,R right){
super(left,right);
this.middle = middle;
}
public String toString(){
return "(" + left + "," + middle + "," + right + ")";
}
}
使用元组
static TwoTuple<String,Object> getTuple(){
return new TwoTuple<String,Object>("key","value");
}
public static void main(String[] args) {
TwoTuple<String,Object> tuple = getTuple();
System.out.println(tuple);
}
泛型接口
生成器(Generator)就是典型的泛型接口应用,用来负责创建对象
生成器(Generator)和工厂模式(FactoryPattern)都是负责创建对象的,两者的区别在于前者不需要传递任何参数信息,后者则需要。
基本类型无法作为类型参数。Java提供的自动打包/拆箱机制转换
泛型方法
泛型方法可以独立于类发生变化
Class GenericClass{
public <T> void genericMethod(T x){
//x.getClass().getName()
}
}
类型参数推断:使用泛型方法不需要指明参数类型,编译器会找出具体类型
杠杆利用类型参数推断
new HashMap<Entity,List<? extends SuperClass>>()
<K,V> Map<K,V>
<T> List<T>
类型参数推断避免了重复的泛型参数列表
泛型用于匿名内部类
泛型的好处之一是简单而安全的创建复杂模型
在泛型内部,无法获得任何有关泛型参数类型的信息