java 泛型

来源:互联网 发布:java并发是什么意思 编辑:程序博客网 时间:2024/06/07 08:04

泛型,也就是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。


看看泛型的需求:

public class GenericTest {    public static void main(String[] args) {        List list = new ArrayList();        list.add("qqyumidi");        list.add("corn");        list.add(100);        for (int i = 0; i < list.size(); i++) {            String name = (String) list.get(i); // 1            System.out.println("name:" + name);        }    }}

上面的代码编译没错误,但是输出的时候肯定出错,因为循环的洗后一个整形没法转化成字符串类型,但是为什么编译可以通过呢,因为集合默认的数据类型是Object,所以集合存储的时候等于对于数据的类型是没有记忆的,为了解决这种问题就需要有参数化类型来解决。其实这种泛型用的很多,平时不注意而已,比如new  ArrayList<string>(),这种指定了参数类型,就是上面的解决办法,因为Arraylist的定义就是参数化的定义,大家可以自己看源码。


1.泛型接口:

之前的文章中也使用到过,直接上个例子一看就明白了

interface QQQ<T>{        void  callback(T t);    }    public class HHH implements QQQ<Integer>{                @Override        public void callback(Integer integer) {                    }    }
2.泛型方法:
public class ArrayAlg {    public static <T> T getMiddle(T[] a) {        return a[a.length / 2];    }}

上面getmiddle就是一个泛型方法,用来返回一个数组的中间值。


3.泛型类:

public class GenericTest {    public static void main(String[] args) {        Box<String> name = new Box<String>("corn");        System.out.println("name:" + name.getData());    }}class Box<T> {    private T data;    public Box() {    }    public Box(T data) {        this.data = data;    }    public T getData() {        return data;    }}


补充:

1.泛型的类型数量可以是一个或者多个,直接用逗号隔开就行了。

2.你定义的泛型,在实例化的时候是不能用基本数据类型的,比如QQQ<int>  这是不行的,必须是自定义类型或者是包装类型QQQ<Integer>是可以的。

3.泛型的好处:安全性好,消除了强制类型转换,性能也提高了

4.java中没有泛型数组一说,想要定义一个数组只能是强制转换:Pair<String, String>[] pairs = (Pair<String, String>[]) new Pair[10];

5。不能抛出也不能捕获泛型类的异常 public static <Textends Throwable>void doWork(T t) throws T ,这种不存在会报错

6.泛型类,不允许存在静态变量或者方法,普通类中可以存在静态的泛型方法。比如说静态类中:

public class People<T> {
    public static T name;
    public static T getName() {
    }
}
在同一时刻,内存中可能存在不只一个People<T>类实例。假设现在内存中存在着一个People<String>对象和People<Integer>对象,而类的静态变量与静态方法是所有类实例共享的。那么问题来了,name究竟是String类型还是Integer类型呢?基于这个原因,Java中不允许在泛型类的静态上下文中使用类型变量。

7.泛型通配符:

上面定义了一个泛型类,那么我就可以说Box<?>在逻辑上是Box<Integer>、Box<Number>...等所有Box<具体类型实参>的父类,同时这个Box<?>就是泛型通配符

当具体类型不清楚或者说不需要明确表示出具体类型的时候,我们可以使用泛型通配符来表示。

public static void getData(Box<?> data) {        System.out.println("data :" + data.getData());    }        public static void getUpperNumberData(Box<? extends Number> data){        System.out.println("data :" + data.getData());    }
这就是两个使用麻烦性通配符的例子。
再来解释一下泛型通配符的上限和下限的说法

上限:extend  

Box<? extends Number>  意思就是说?是number的自身或者number类的子类

下限:super、

和extend相反,不是子类,是父类


原创粉丝点击