泛型
在集合中使用泛型:
1.集合接口或集合类在jsdk5.0时都修改为带泛型的结构。
2.在实例化集合类时,可以指明具体的泛型类型。
3.指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(方法,构造器,属性等)使用到类的泛型的位置,都指定为实例化的泛型类型,
比如:add(E e),实例化以后,add(Integer e)。
4.泛型的类型必须是类,不能是基本数据类型,需要用到基本数据类型时,使用包装类。
5.如果实例化时没有指明泛型的类型,默认类型为Object类型
自定义泛型结构
一、泛型类,泛型接口:
public class Order<T> {
String name;
int id;
//类的内部结构可以使用类的泛型
T orderT;
public Order() {
}
public Order(String name, int id, T orderT) {
this.name = name;
this.id = id;
this.orderT = orderT;
}
public T getOrderT() {
return orderT;
}
public void setOrderT(T orderT) {
this.orderT = orderT;
}
}
没有使用泛型
public class GenericTest {
@Test
public void test(){
//如果定义了泛型类,实例化没有指明类的泛型,则认为此泛型类型为Object类型
Order order = new Order();
order.setOrderT(213);
order.setOrderT("abc");
}
}
使用泛型
@Test
public void test(){
Order<String> order = new Order<>("a",123,"bbb");
order.setOrderT("111");
order.setOrderT("abc");
}
public class SubOrder extends Order<Integer> {//不是泛型类
}
@Test
public void test1(){
//由于子类在继承带泛型的父类时,指明了泛型的类型,则实例化子类对象时,不再需要指明泛型
SubOrder subOrder = new SubOrder();
subOrder.setOrderT(1);
}
注意:
1.类中的静态方法中,不能使用类的泛型
2.异常类不能声明为泛型类
3.不能声明:T[] arr = new T[10]; 可以这样声明:T[] arr = (T[]) new T[10];
二、泛型方法:
public class SubOrder<Integer> extends Order<Integer> {
//泛型方法
public <E>List<E> copyFromArrayToList(E[] arr){
List<E> list = new ArrayList<>();
for(E e : arr){
list.add(e);
}
return list;
}
}
public class SubOrder<T> extends Order<Integer> {
//泛型方法
//可以声明为静态的,泛型参数是在调用方法时确定的,并非在实例化时确定的
public <E>List<E> copyFromArrayToList(E[] arr){
List<E> list = new ArrayList<>();
for(E e : arr){
list.add(e);
}
return list;
}
}
@Test
public void test2(){
SubOrder<String> subOrder = new SubOrder<>();
Integer[] nums = new Integer[]{1,2,3,4,5};
//泛型方法在调用时,指明泛型参数的类型
List<Integer> list = subOrder.copyFromArrayToList(nums);
}
通配符:?
类A是B的父类,G<A>和G<B>是没有关系的,二者共同的父类是G<?>



浙公网安备 33010602011771号