泛型是Java 1.5的新特性,泛型的本质是参数化类型,也就是说错作的数据类型被指定为一个参数,这种参数类型可以在类,
接口,方法中创建,分别叫泛型类,泛型接口,泛型方法
java引入泛型的好处就是安全简单.在没有引入泛型之前,通过对类型Object的引用来实现参数的任意化.它的缺点就是需要显示的进行类型转换.
Object o = "大强"; String name = (String) o;
规则和限制
泛型的类型参数只能是类类型,不能是简单类型int,char之类.
它的类型参数可以有多个Class<T,V,K>
package com.neusoft.kora.cxn.bean; import java.util.HashMap; import java.util.Map; /** * Created by lenovo on 2015/12/8. */ public class Person<T,K,V> { private Map<K,V> hobbys = new HashMap<K, V>(); private T sex; void setHobby(K key, V val) { this.hobbys.put(key, val); } void setSex(T sex) { this.sex = sex; } T getSex() { return sex; } public Map<K, V> getHobbys() { return hobbys; } public Person setHobbys(Map<K, V> hobbys) { this.hobbys = hobbys; return this; } @Override public String toString() { return "Person{" + "hobbys=" + hobbys + ", sex=" + sex + '}'; } } interface Sex{ public String getSex(); } class Boy implements Sex{ public String getSex(){return "boy";} @Override public String toString() { return getSex(); } } class Girl implements Sex{ public String getSex(){return "gril";} } class Application{ public static void main(String[] args) { Person<Sex,Integer,String> person = new Person<Sex, Integer, String>(); person.setHobby(1,"打篮球"); person.setHobby(2,"玩游戏"); person.setSex(new Boy()); System.out.println(person); } }
泛型的参数类型可以使用extends关键字,Class<T extends superClass>,都叫它为有界限的类型.
泛型参数类型还可以是通配符类型,Class<?> clazz = Class.forName("");不确定的类型.
package com.neusoft.kora.cxn.bean; import java.util.ArrayList; import java.util.List; /** * Created by lenovo on 2015/12/8. */ class Money<T extends Number> { private T val; public T getVal() { return val; } public Money(T val) { this.val = val; } @Override public String toString() { return "Money{" + "val=" + val + '}'; } } public class Shop { /** * 可以接收任意类型的数据.直接把参数返回 */ public <T> T method(T t) { return t; } /** * 方法中传入或返回的泛型类型由调用方法时所设置的参数类型决定 */ public static <T extends Number> Money<T> showMoney(T money) { return new Money(money); } public static List<?> printHuo(List<? super Huo> huo){ return huo; } public static <E> List<E> newArrayList() { return new ArrayList<E>(); } // 返回泛型数组 public static <T> T[] fun1(T...arg){ return arg; } public static <T> void fun2(T param[]){ // 输出 System.out.print("接收泛型数组:") ; for(T t:param){ System.out.print(t + "、") ; } } public static void main(String[] args) { showMoney(10.222); List<Money<Double>> x = newArrayList(); } } interface Huo{}
带有 extends 用于读取,可用于的返回类型限定,不能用于参数类型限定。 带有 super 用于写入, 可用于参数类型限定,不能用于返回类型限定。