java泛型

泛型:JDK1.5版本以后出现新特性,用于解决安全问题,是一个安全机制.

升级3部 高效 简化书写 安全

好处:

1将运行时期出现问题ClassCastException类型转换异常,转移到了编译时期.方便程序员解决问题,让运行事情问题减少,安全.

2.避免了强制转换麻烦.

在使用java提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见,只要见到<>就要定义泛型.

其实<>就是用来接收类型的.

什么时候定义泛型类?

 

当类中要操作的引用数据类型不确定的时候.


为了让不同方法可以操作不同类型,而且类型还部确定

那么可以将泛型在方法上

特殊之处:

静态方法不可以访问类上定义的泛型.

如果静态方法操作的应用数据类型不确定.可以将泛型定义在方法上.

泛型的位置也有将就

Public static <QQ> getfanxing(){} 位置错了也会报错.

可以既有泛型类,也有泛型方法

 

泛型定义在方法上事例

package pack;

import java.util.ArrayList;
import java.util.Collection;

public class Demo{
	public static void main(String[] args) {
		
	}
	
	//泛型定义在方法上,返回值和参数都是泛型
	public static <T> T show(ArrayList<T> al){
		
		return null;
	}
	
	//泛型定义在方法上,
	public static <T> void show(Collection<T> al){
		
	}
}

  

泛型定义在类上事例

package pack;

import java.util.ArrayList;
import java.util.Collection;

public class Demo<T>{
	T a;
	
	
}

class Gen<T>{
	T a;
	public Gen(T obj){
		
	}
	
	public void Get(T t){
		
	}
	
	public T getObj(){
		return null;
	}
}

  

 

泛型的限定:

 

? 通配符,也可理解为占位符

 

泛型的限定:

 

? extends E:可以接收E类型或者E的子类型.上限. 既能接收也能接收E的子类型 

 

?super E:可以接收E类型或者E的父类型.下限.

 

 

 

?	通配符,也可理解为占位符
泛型的限定:
public static void printToll(ArrayList<?> al)    //泛型通配符.?
{
    Iterator<?> it = al.iterator();
    while(it.hasNext())
    {
        System.out.println(it.next());
    }
}

 

泛型限定使用

package pack;

import java.util.*;

public class Demo
{ 
    public static void main(String args[])
    {
        TreeSet<Student> t1 = new TreeSet<Student>(new Comp());
        t1.add(new Student("abc03"));
        t1.add(new Student("abc04"));
        t1.add(new Student("abc01"));
        print(t1);

        TreeSet<Worker> t2 = new TreeSet<Worker>(new Comp());
        t2.add(new Worker("ab08"));
        t2.add(new Worker("ab03"));
        t2.add(new Worker("ab07"));
        print(t2);

    }

    public static void print(TreeSet<? extends Person> t)
    {
        Iterator<? extends Person> it = t.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next().getName());
        }
    }

}

class Person
{
    private String name;
    Person(String name)
    {
        this.name = name;
    }
    public String getName()
    {
        return name;
    }
}

class Student extends Person
{
    Student(String name)
    {
        super(name);
    }
}

class Worker extends Person
{
    Worker(String name)
    {
        super(name);
    }
}

/**
 * 这个比较器可以给Person 和Person子类使用
 */
class Comp implements Comparator<Person>
{
    public int compare(Person p1,Person p2)
    {
        return p2.getName().compareTo(p1.getName());
    }
}

 

泛型应用

class Demo
{
    public <T> void show(T t)
    {
        System.out.println("show:"+t);
    }
    public <Q> void print(Q q)
    {
        System.out.println("print:"+q);
    }
}

public class GenericDemo4
{
    public static void main(String args[])
    {
        Demo d = new Demo();
        d.show("haha");
        d.show(new Integer(4));
        d.print("heihei");
    }
}

 

 

泛型应用2

package pack;

import java.util.*;

public class xiandingDemoTwo {
    public static void main(String args[]) {
        // InterOne i = new InterOne();
        // i.show("haha");

        InterTwo<Integer> i = new InterTwo<Integer>();
        i.show(4);
    }
}

interface Inter<T> {
    void show(T t);
}

class InterOne implements Inter<String> {
    public void show(String t) {
        System.out.println("show:" + t);
    }
}

//如果T没被替换成对象,那么T还是写T.   T也可以写成上面一样
class InterTwo<T> implements Inter<T> {
    public void show(T t) {
        System.out.println("show:" + t);
    }
}

泛型应用3

package pack;
class Worker
{
}

class Student
{
}


//泛型前做法
class Tool
{
    private Object obj;
    public void setObject(Object obj)
    {
        this.obj = obj;
    }
    public Object getObject()
    {
        return obj;
    }
}


//泛型类
class Utils<QQ>
{
    private QQ q;
    public void setObject(QQ q)
    {
        this.q = q;
    }
    public QQ getObject()
    {
        return q;
    }
}


public class Demo
{
    public static void main(String args[])
    {
    /*    Tool t = new Tool();
        t.setObject(new Student());    //出现类型转换异常
        Worker w = (Worker)t.getObject();
    */
        
        Utils<Worker> u = new Utils<Worker>();
        u.setObject(new Worker());
        Worker w = u.getObject(); 
    }
}

 

泛型应用3

package pack;
/**
 * 泛型类,泛型方法,3种泛型重合
 */

class Demo<T>
{
    public void show(T t)
    {
        System.out.println("show:"+t);
    }
    public <Q> void print(Q q)
    {
        System.out.println("method:"+q);
    }
    public static <W> void method(W w)// 这里<w>一定要房子啊static后面 void前面
    {
        System.out.println("method:"+w);
    }
}

public class GenericDemo5
{
    public static void main(String args[])
    {
        Demo<String> d = new Demo<String>();
        d.show("haha");
        d.print(4);
        d.print("hehe");
        d.method("hahahaha");
    }
}

 

 通配符的应用

package pack;

import java.util.*;

public class xiandingDemo
{
    public static void main(String args[])
    {
        ArrayList<String> al = new ArrayList<String>();
        al.add("abc1");
        al.add("abc2");
        al.add("abc3");
        
        ArrayList<Integer> al1 = new ArrayList<Integer>();
        al1.add(5);
        al1.add(2);
        al1.add(6);
        
        printColl1(al);
        printColl2(al1);
    }

    public static void printColl1(ArrayList<?> al)
    {
        Iterator<?> it = al.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
    
//    printColl1和printColl2的区别是?代表未知 是占位符 T是具体的类型
    
    public static <T> void printColl2(ArrayList<T> al)
    {
        Iterator<T> it = al.iterator();
        while(it.hasNext())
        {
            System.out.println(it.next());
        }
    }
}

 

posted @ 2014-12-01 11:27  wikiki  阅读(207)  评论(0编辑  收藏  举报