Java泛型

来源:互联网 发布:广州恒大淘宝俱乐部 编辑:程序博客网 时间:2024/06/06 03:20

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

为什么需要泛型

在JDK 1.5前,集合使用Object来存储对象,这会导致集合对元素类型没有任何限制,需要增加强制类型转换

使用

所谓泛型就是在定义类、接口、方法时使用形参。

public interface Map<k,v> {Set<K> keyset();    V put(K key,V val); }

从泛型类派生子类

  • 继承泛型类或实现泛型接口时,不能再使用类型形参,可以这样做:
    public class A<T > extends B <T >
    public class A extends B<String> or
    public class A extends B(默认T是object) (!这种情况下的重写的返回类型!!!)
  • 不管传入哪一种类型实参,他们都被java当做同一个类,所以在静态方法、静态初始块和静态变量的声明中不允许使用(类或接口的)类型形参。系统不会真正生成泛型类。
    【数组、集合类型的父子关系】

类型通配符

类型通配符是一个问号(?),将一个问号作为类型实参传给List集合,写作List<? >(意思是元素类型未知的List)
- 类型通配符上限
- list(? extends)
- 类型形参的上限
public class A <T extends Integer >
public class A <T extends Integer & interfaceA >
- 类型参数的下限
<? super T>

泛型方法

修饰符 <T,S> 返回类型 方法名(形参)
static <T> T function(Collection<T extends A> )
- 泛型构造器
- 与类型通配符比较(泛型方法,主要用来表达参数之间的关系,以及返回值与参数之间的关系)
- 泛型方法与方法重载
在一个类中可以同时定义如下两个方法:
public static<T> T COPY(Collection<T> dest,Collection<? extends T> src)
public static<T> void COPY(Collection<? super T> dest,Collection<T> src)
但调用时会报错

Java泛型的原理

http://blog.csdn.net/lonelyroamer/article/details/7868820