Java泛型(一)

来源:互联网 发布:神马打印软件注册码 编辑:程序博客网 时间:2024/04/20 06:56

这里面会讲到泛型存在的意义,到泛型的种类,什么情况下可以用泛型,用到泛型的好处。

一:泛型的重要应用场合之一————集合

JKD1.5增加泛型支持在很大程度上都是为了让集合能记住其元素的数据类型。在没有泛型之前,一旦把对象存到Java集合中,集合就会忘记对象的类型,把所有的对象当成Object类型处理。当程序从集合中取出对象后,就需要进行强制类型转换,这种强制类型转换不仅使代码臃肿,而且容易引起ClassCastExecption异常。(所以泛型的重要应用场合之一 就是在集合上,保证了集合的数据类型的安全)

定义泛型接口、类

所谓泛型,就是允许在定义类,接口,方法时使用类型形参,这个类型形参将在声明变量,创建对象,调用方法时动态地指定(即传入实际的类型参数,也可称为类型实参)。Java 5改写了集合框架中的全部接口和类,为这些接口,类增加了泛型支持,从而可以在生命集合变量,创建集合对象时传入类型实参,这就是在前面程序中看到的List和ArrayList两种类型。
下面是Java5改写后List接口的代码片段。

public interface List<E>{    //在该接口里,E可作为类型使用    void add(E x);    Iterator<E> iterator();}

泛型的实质:允许在定义接口、类时声明类型形参,类型形参在整个接口,类体内可当成类型使用,几乎所有可使用普通类型的地方都可以使用这种类型形参。
在使用的时候可以为类型形参 E 传入String类型,则产生了一个新的类型List类型,可以把List想象成E被全部替换成String的特殊List子接口。(但其实并没有生成新的类,这种类不存在于物理上,只是逻辑上生成了新的类)

二:泛型的写法注意事项

1.在Java7以前,如果使用泛型的接口,类定义变量,那么调用构造器创建对象时构造器的后面也必须带泛型,这显得有些多余了。例如如下两条语句:

List<String> strList=new ArrayList<String>();Map<String,Integer> scores=new HashMap<String,Integer>();

上面两条语句中的等号右边的<>“菱形”里面的内容完全是多余的,在Java7以前这是必须的,不能省略。从Java7开始,Java允许在构造器后不需要带完整的泛型信息,只要给出一对尖括号(<>)即可,Java可以推断尖括号里应该是什么泛型信息。即上面两套语句可以改写成如下形式:

List<String> strList=new ArrayList<>();Map<String,Integer> scores=new HashMap<>();

把两个尖括号并列放在一起非常像一个菱形,这种语法也就被称为”菱形”语法。其实这种语法对原有的泛型并没有改变,只是更好的简化了泛型编程。

2.子类继承带有泛型形参的父类的时候,子类不能再包含类型形参。例如下面的代码是错误的。

//定义类A继承Apple类,Apple类不能有类型形参public class Apple<T>{    //使用T类型形参定义实例变量    private T info;        private T info;        public Apple(){            this.info = info;        }        public void setInfo(){            this.info=info;        }        public T getInfo(){            return this.info;        }        public static void main(){            //由于传给T形参的是String,所以构造器参数只能是String            Apple<String> a1=new Apple<>("苹果");            System.out.println(a1.getInfo);        }    }}public class A extends Apple<T>{}  //这个写法是错误的,父类有类型形参,子类继承的时候不能在定义类型形参了。如果从Apple<String>类派生子类,则在Apple类中所有使用T类型形参的地方将被替换成String类型,即它的子类将会继承到String getInfo()和void setInfo(String info)两个方法,如果子类需要重写父类的方法,就必须注意这一点。 

在继承父类的时候也可以不定义泛型类型形参,但是这样会报警告————这就是泛型的检查的警告:使用了未经检查或不安全的操作。此时,系统会把Apple类里的T形参当成Object类型处理。

0 0