java泛型

泛型
没有引入时:
//没有泛型 时,Object 是所有类的父类,所以向上转型
class Generics
{
    private Object obj;
    public void setObj(Object obj)
    {
        this.obj = obj;
    }
    public Object getObj()
    {
        return this.obj;
    }
}

public class Hi
{
    public static void main(String[] args)
    {
        Generics gd = new Generics();
        gd.setObj(new Integer(5));
        Integer in = (Integer)gd.getObj();
        System.out.println("设置的数:"+in);
        gd.setObj(new Float(1.23F));
        Float f = (Float)gd.getObj();
        System.out.println("设置的数:"+f);
    }
}
/*
设置的数:5
设置的数:1.23
*/
如果向下转型则容易报错

泛型的创建
[public] class 类名 <泛型类型标识1[,泛型 类型标识2,...]>
{
    // 定义属性
    [访问控制符] 泛型类型标识     变量名;
    // 定义方法
    [访问控制符] 泛型类型标识    方法名(){};
    // 定义方法
    [访问控制符] 返回值类型    方法名(泛型类型标识   参数名){};
}
一般而言,类型的参数命名为单个大写字母,普通名称如下:
E--元素
K--键
N--数字
T--类型
V--值
S,U,V--第二,第三,第四个类型
// 声明泛型
class Generics<T>
{
    private T obj;
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return obj;
    }
}

// 定义泛型对象
类名<泛型类型> 对象名 = new 类名<泛型类型>();
其中类型为引用类型,不可为基本数据类型

class Generics<T>
{
    private T obj;
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return this.obj;
    }
}
public class Hi
{
    public static void main(String[] args)
    {
        // 只能是用引用的 Integer,不能用 int表示
        Generics<Integer> gd1 = new Generics<Integer>();
        gd1.setObj(new Integer(5)); // 同上转型
        Integer in = gd1.getObj();  // 向下转型
        System.out.println("设置的数为:"+in);
        Generics<Float> gd2 = new Generics<Float>();
        gd2.setObj(new Float(1.23)); // 同上转型  
        Float f = gd2.getObj(); // 向下转型
        System.out.println("设置的数组为:"+f);
    }
}
/*
设置的数为:5
设置的数组为:1.23
*/
泛型类的构造方法与普通的无什么不同
构造方法格式如下:
[访问控制符] 类名([泛型类型] 参数列表)
{
    // 构造方法语句
}
// 应用
class Generics<T>
{
    private T obj;
    public Generics(){}
    public Generics(T obj)
    {
        setObj(obj);
    }
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return this.obj;
    }
}
public class Hi
{
    public static void main(String[] args)
    {
        Generics<Integer> gd = new Generics<Integer>(5);
        int in = gd.getObj();
        System.out.println(in);
    }
}

//定义泛型类时声明多个类型
class Generics<T,S>
{
    private T obj1;
    private S obj2;
    public Generics(){}
    public Generics(T obj1, S obj2)
    {
        setObj1(obj1);
        setObj2(obj2);
    }
    public void setObj1(T obj1)
    {
        this.obj1 = obj1;
    }
    public void setObj2(S obj2)
    {
        this.obj2 = obj2;
    }
    public T getObj1()
    {
        return this.obj1;
    }
    public S getObj2()
    {
        return this.obj2;
    }
    public void show()
    {
        System.out.println("姓名:"+getObj1()+",年龄:"+getObj2());
    }
}
public class Hi
{
    public static void main(String[] args)
    {
        Generics<String, Integer> gd = new Generics<String, Integer>("小二", 27);
        gd.show();
    }
}
//姓名:小二,年龄:27

// =========
//接收任意指定泛型时需要使用通配符
//无界通配符 "?"
class Generics<T,S>
{
    private T obj1;
    private S obj2;
    public Generics(){}
    public Generics(T obj1, S obj2)
    {
        setObj1(obj1);
        setObj2(obj2);
    }
    public void setObj1(T obj1)
    {
        this.obj1 = obj1;
    }
    public void setObj2(S obj2)
    {
        this.obj2 = obj2;
    }
    public T getObj1()
    {
        return this.obj1;
    }
    public S getObj2()
    {
        return this.obj2;
    }
    public void show()
    {
        System.out.println("姓名:"+getObj1()+",年龄:"+getObj2());
    }
    public String toString()
    {
        return "姓名:"+getObj1()+",年龄:"+getObj2();
    }
}
public class Hi
{
    public static void main(String[] args)
    {
        Generics<?,?> gd = new Generics<String, Integer>("小二", 27);
        gd.show();
        fun(gd);
    }
    public static void fun(Generics<?,?> t)
    {
        System.out.println("fun():"+t);
    }
}
/*
姓名:小二,年龄:27
fun():姓名:小二,年龄:27
*/

受限泛型
设置类型形参的上限
定义类
<泛型 类型 标识 extends 泛型类型1 & 泛型类型2 ....>
一个类型参数可以用多个限界类型。限界类之间用 "&"分隔开,在多个限界类型中,可以用多个接口,
但只能有一个类。如果类作为限界类型,则必须放在限界列表中的第一个。
// 设置通配符的上限
// 因为是 继承了 Number类,所以只能是数字
class Generics<T extends Number>
{
    private T obj;
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return this.obj;
    }
    public void show(Generics<?> t)
    {
        System.out.println("show():"+getObj());
    }
}
public class Hi
{
    public static void main(String[] args)
    {
        Generics<Integer> gd1 = new Generics<Integer>();
        gd1.setObj(3);
        gd1.show(gd1);
        info(gd1);
        Generics<Double> gd2 = new Generics<Double>();
        gd2.setObj(1.234);
        gd2.show(gd2);
        info(gd2);
    }
    public static void info(Generics<? extends Number> t)
    {
        System.out.println("info():"+t.getObj());
    }
}
/*
show():3
info():3
show():1.234
info():1.234
*/
// =========
//还可以设置下限,使其只能是某种类型或该类型的父类,只需使用 super关键字
<? super 泛型类型>
class Generics<T>
{
    private T obj;
    public Generics(){}
    public Generics(T obj)
    {
        setObj(obj);
    }
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return this.obj;
    }
    public String toString()
    {
        return getObj().toString();    
    }
}
public class Hi
{
    public static void main(String[] args)
    {
        Generics<Integer> p = new Generics<Integer>(21);
        info(p);
    }
    //可接收 Integer, Number, Object
    public static void info(Generics<? super Integer> t)
    {
        System.out.println("info():"+t);
    }
}
// =============
//泛型也可以作为父类或子类,同样也适用于继承
//以泛型 类为父类,当父类为泛型时,该类也必定是泛型
class Generics<T>
{
    private T obj;
    public Generics(){}
    public Generics(T obj)
    {
        setObj(obj);
    }
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return this.obj;
    }
}
public class Hi<T> extends Generics<T>
{
    public Hi(){}
    public Hi(T obj)
    {
        super(obj);
    }
    public String toString()
    {
        return getObj().toString();
    }
    public static void main(String[] args)
    {
        Hi<String> p = new Hi<String>("小二");
        System.out.println("内容为:"+p);
    }
}
// =============
// 子类自身的需求增加泛型类型
class Generics<T>
{
    private T obj;
    public Generics(){}
    public Generics(T obj)
    {
        setObj(obj);
    }
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return this.obj;
    }
}
public class Hi<T,S> extends Generics<T>
{
    private S sub;
    public Hi(){}
    public Hi(T obj, S sub)
    {
        super(obj);
        setSub(sub);
    }
    public void setSub(S sub)
    {
        this.sub = sub;
    }
    public S getSub()
    {
        return this.sub;
    }
    public String toString()
    {
        return ("姓名:"+getObj().toString()+",年龄:"+getSub());
    }
    public static void main(String[] args)
    {
        Hi<String, Integer> p = new Hi<String, Integer>("小二", 27);
        System.out.println("对象内容:"+p);
    }
}
// ==========
//以非泛型类为父类,这时不再需要传递参数给父类
class Generics{}
public class Hi<T> extends Generics
{
    private T obj;
    public Hi(){}
    public Hi(T obj)
    {
        setObj(obj);
    }
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return this.obj;
    }
    public String toString()
    {
        return getObj().toString();
    }
    public static void main(String[] args)
    {
        Hi<String> p = new Hi<String>("小二");
        System.out.println("对象内容:"+p);
    }
}
// =============
//泛型 接口,与泛型类差不多
[访问控制符] interface 接口名称 <泛型类型标识>
{
    // code
}

interface Hi<T>
{
    public T add();
}

// =========
interface InterGenerics<T>
{
    public T show();
}
class Generics<T> implements InterGenerics<T>
{
    private T obj;
    public Generics(){}
    public Generics(T obj)
    {
        setObj(obj);
    }
    public void setObj(T obj)
    {
        this.obj = obj;
    }
    public T getObj()
    {
        return this.obj;
    }
    public T show()
    {
        return getObj();
    }
}
public class Hi
{
    public static void main(String[] args)
    {
        Generics<Integer> g = new Generics<Integer>(5);
        System.out.println("对象内容:"+g.show());
    }
}
//=============
子类在实现泛型接口时明确地给出泛型类型
interface InterGenerics<T>
{
    public T show();
}
class Generics implements InterGenerics<Integer>
{
    private Integer obj;
    public Generics(){}
    public Generics(Integer obj)
    {
        setObj(obj);
    }
    public void setObj(Integer obj)
    {
        this.obj = obj;
    }
    public Integer getObj()
    {
        return this.obj;
    }
    public Integer show()
    {
        return this.getObj();
    }
}
public class Hi
{
    public static void main(String[] args)
    {
        Generics g = new Generics(5);
        System.out.println(g.show());
    }
}
// -----------
//泛型方法
格式:
[访问控制符] [static|final] <泛型类型标识>返回值类型 方法名([<泛型类型参数>] [参数])
// ---------
class Generics
{
    public <T> T show(T t)
    {
        return t;
    }
    public static <T> T staticShow(T t)
    {
        return t;
    }
}
// ==========
使用泛型方法
格式1:
[对象名|类名.]方法名(实参列表);

格式2:
[对象名|类名.]<实际泛型类型>方法名(实参列表);
// ------------
class Generics
{
    public <T> T show(T t)
    {
        return t;
    }
    public static <T> T staticShow(String str, T t)
    {
        return t;
    }
}

public class Hi
{
    public static void main(String[] args)
    {
        Generics gen = new Generics();
        System.out.println("格式一:"+gen.show("小二"));
        System.out.println("格式1:"+Generics.staticShow("小二", 27));
        
        System.out.println("格式2:"+gen.<String>show("小二"));
        System.out.println("格式3:"+Generics.<Integer>staticShow("99", 98));
    }
}

 

posted @ 2015-03-06 12:53  好记性还真不如烂笔头  阅读(197)  评论(0编辑  收藏  举报