分类: Java
2012-03-25 22:56:53
java里也有范型的概念,可以自定义范型类、范型接口、范型内部类和范型方法等:
java的范型在定义时不是假定范型参数支持哪些方法,尽管C++是可以做到的。看下面的代码:
java中之所以用擦除的方式来实现范型,而不是像C++一样根据不同的范型参数具现化不同的类,是由于java语言在发布初期并不支持范型,在发布很长时间后才开始引入范型,为了很原来的类库兼容才使用了擦除。擦除会把参数T换成Object。
因为擦除,在范型类里是不能创建范型参数类型的对象,因为编译器不能保证T拥有默认构造器:
范型的边界(extends)可以加入多个限定,但只能是一个类和多个接口:
试试把一个子类的数组赋给父类数组的引用:
有时候你可能就是希望一个合法的向上转型,这时可以使用通配符:
有一种看起来很诡异的范型参数定义,即自限定的类型。它是这样的形式:
自限定类型一般用于参数协变。Java是支持返回值协变的:
尽管支持返回值协变,Java并不支持参数协变。改写父类和子类的定义:
Java容器的插入方法并不检查类型,所以很可能会插入错误的类型: