泛型
泛型的概念
- 所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时
- 从JDK1.5以后,Java引入了“参数化类型(Parameterized type)”的概念,允许我们在创建集合时再指定集合元素的类型,正如:List,这表明该List只能保存字符串类型的对象。
- JDK1.5改写了集合框架中的全部接口和类,为这些接口、类增加了泛型支持,从而可以在声明集合变量、创建集合对象时传入类型实参
在集合中使用泛型
- 集合接口或集合类在jdk5.0时都修改为带泛型的结构
- 在实例化集合类时,可以指明具体的泛型
- 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构使用到类的泛型的位置,都指定为实例化的泛型类型 比如:add(E e) —>实例化后 add(Integer e)
- 注意点:泛型的类型必须是类,不能是基本数据类型,需要用到基本数据类型的位置,呐包装类替换
- 如果实例化时,没有指明泛型的类型.默认为java.lang.Object类型
自定义泛型结构
- 如果实例化时,没有指明泛型的类型.默认为java.lang.Object类型
- 要求:如果大家定义类类是带泛型的,建议在实例化时要指明类的泛型
- 建议:实例化时指明类的泛型
- 由于子类在继承带泛型的父类时,指明了泛型的类型,则实例化子类对象时,不再需要指明泛型
@Test
public void Test1(){
Order order=new Order();
order.setOrderT(123);
order.setOrderT("ABC");
Order<String> order1=new Order<String>("orderAA",1001,"ORDER" );
order1.setOrderT("orderBB");
}
泛型在继承上的体现
- 如果B是A的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口,G并不是G的子类型
public void testGenericAndSubClass() {
Person[] persons = null;
Man[] mans = null;
persons = mans;
Person p = mans[0];
List<Person> personList = null;
List<Man> manList = null;
}
通配符的使用
1. 使用类型通配符:?
- 写入list中的元素时,不行。因为我们不知道c的元素类型,我们不能向其中
添加对象。唯一的例外是null,它是所有类型的成员。
- 有限制条件的通配符的使用
- ? extends A:
G<? extends A>可以作为G和G的父类的,其中B是A的子类
- ? super A:
G<? super A>可以作为G和G的父类的,其中B是A的父类
- 通配符指定上限
上限extends:使用时指定的类型必须是继承某个类,或者实现某个接口,即<=
- 通配符指定下限
下限super:使用时指定的类型不能小于操作的类,即>=