泛型

为什么要泛型?如果不使用泛型会写成如何?

public class NoGenerci {

    public static void main(String[] args) {

        Set set = new HashSet();
        A a = new A();
        B b = new B();
        C c = new C();
        
        set.add(a);
        set.add(b);
        set.add(c);
        
        //要求遍历集合,调用里面的方法
        Iterator it = set.iterator();
        while(it.hasNext()){
            Object o = it.next();
            
            //只能做大量的强制类型转换
            if (o instanceof A){
                A a1 = (A)o;
                a1.m1();
            }else if (o instanceof B){
                B b1 = (B)o;
                b1.m2();
            }else if (o instanceof C){
                C c1 = (C)o;
                c1.m3();
            }
        }
        
    }

}
class A{
    public void m1(){
        System.out.println("A's m1 () ... ");
    }
}

class B{
    public void m2(){
        System.out.println("B's m2 () ... ");
    }
}
class C{
    public void m3(){
        System.out.println("C's m3 () ... ");
    }
}

C's m3 () ...
A's m1 () ...
B's m2 () ...

所以以上程序没有使用泛型有啥缺点?

集合中的元素类型不统一、在遍历集合的时候只能拿出Object出来做大量的强制类型转换,折腾

优点呢?

集合中可以存储不同类型的元素,如果使用泛型就只能存一种

所以关键还是看你怎么看这个问题!

那么泛型语法如何实现

泛型是一个编译阶段的语法,在编译阶段统一集合中的元素,如

public class GenericTest {

    public static void main(String[] args) {
        List<String> list = new ArrayList();
        list.add("kobe");
        list.add("lbj");
        list.add("tracy");
        list.add("kg");
        
        Iterator it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }

}

 SortedSet实现泛型

public class SortedSetTest {

    public static void main(String[] args) {
        
        SortedSet<Manager> set = new TreeSet();
        
        Manager m1 = new Manager(1500);
        Manager m2 = new Manager(15200);
        Manager m3 = new Manager(12500);
        Manager m4 = new Manager(150);
        Manager m5 = new Manager(500);
    
        set.add(m1);
        set.add(m2);
        set.add(m3);
        set.add(m4);
        set.add(m5);
        //遍历
        Iterator<Manager> it = set.iterator();
        while (it.hasNext()){
            Manager m = it.next();
            System.out.println(m.sal);
        }
    }

}

class Manager implements Comparable<Manager>{
    double sal;
    
    public Manager(double sal){
        this.sal = sal;
    }
    
    @Override
    public int compareTo(Manager o) {
        if (this.sal > o.sal) //这里就不用再强制转换了
            return 1;
        else if (this.sal < o.sal)
            return -1;
        else 
            return 0;
    }
}

 自定义泛型

public class CustomGeneric {

    public static void main(String[] args) {
        MyClass<String> m = new MyClass();
        m.print("hello"); //这里只能是String,不然编译报错,因为泛型是编译器检查类型
    }
    
}

class MyClass<T>{
    
    public void print(T t){
        System.out.println(t);
    }
}
原文地址:https://www.cnblogs.com/i-love-kobe/p/5908441.html