Java泛型
在JDK1.5之前只能把元素类型设计为Object,JDK1.5后使用泛型,指定泛型参数的模型。
1.泛型在集合中的使用
如果在List不使用泛型,在List添加多种类型,使用Object对象进行读取,如果进行强转会出现错误。
@Test
public void GenericListTest()
{
List list = new ArrayList();
list.add("123");
list.add(123);
Iterator iterator = list.iterator();
while(iterator.hasNext())
{
String next = (String) iterator.next();//因为list有Integer类型,强转会报错
System.out.println(next);
}
}
所以在Java5.0中新增泛型,可以在创建集合时指定相应的泛型,在使用集合相关方法时候,必须使用指定类型.
ArrayList<String> list1 = new ArrayList<>();//后面<>里面的类型可以省略
list1.add("123");
Iterator<String> iterator1 = list1.iterator();
while(iterator1.hasNext())
{
System.out.println(iterator1.next());
}
2.泛型类、泛型接口、泛型方法
2.1泛型类、泛型接口
创建一个泛型类Person
package com.cwstd.generic;
public class PersonGeneric<T> {
private String name;
private T type;
public PersonGeneric(String name,T type)
{
this.name=name;
this.type=type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public T getType() {
return type;
}
public void setType(T type) {
this.type = type;
}
}
在创建一个Student类继承Person类
注意:继承的时候可以指明泛型的类型,也可以延续父类的泛型
public class Student extends PersonGeneric<String>{//继承时候指定泛型的类型
public Student(String name, String type) {
super(name, type);
}
}
泛型接口与泛型类的使用方法相同,区别就是一个是接口,一个是类。声明的泛型T,可以在定义泛型接口中使用。
2.2泛型方法
创建一格泛型方法,将泛型数组array1复制泛型数组array上
public <E> E [] copy(E [] array,E [] array1)
{
array=array1;
return array;
}
注意:
- 不是引用了泛型类的泛型参数就是泛型方法,需要在方法上定义了自己的泛型变量,而且需要在方法前加上<泛型>。
- 使用类的泛型的方法,前面不能加上static,成为静态方法。(调用方法前,需要指明类的泛型变量,而静态方法可以直接调用)
3.泛型在继承上的体现
如果有两个类A(父类)B(子类):
对象G < A > 与 G < B >不能互相赋值,但是对象A < G > 与 B < G > 则可以互相赋值。
List<Object> objects = new ArrayList<Object>();
List<String> strings = new ArrayList<>();
objects=strings;//错误