泛型的运用

泛型是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 用于写入, 可用于参数类型限定,不能用于返回类型限定。

 

你可能感兴趣的:(java泛型的运用)