泛型类和泛型接口
泛型标注在类名后边,例如
public class A<T> {
public String Name;
public T t;
public A(String name,T t)P{
this.name=name;
this.t=t;
}
}
public static void main(String args[]){
A<String> aa = new A<>();
}
在实例化对象时,如果未指明泛型的类型,那么会默认泛型为Object类型。
子类继承了父类时,有如下几种泛型的定义方式
public class father<K,V>{}
//擦除父类的泛型
public class son extends father {}
//实现
public class son extends father<String,Integer> {}
//保留全部泛型
public class son<K,V> extends father<K,V> {}
//保留部分泛型
public class son<V> extends father<String,V> {}
注意:静态方法中不能使用泛型,异常类不能申明为泛型。
泛型方法
泛型方法不一定要在泛型类中,并且法可以声明为静态方法,定义格式如下:
public <E>E[] get(E[] e){}
通配符的使用
为什么需要通配符?因为以下语句会报错,不能直接将泛型集合类赋给对应的局部变量。
public class GernericTest {
public static void main(String[] args) throws Exception{
List<Integer> listInteger =new ArrayList<Integer>();
List<String> listString =new ArrayList<String>();
printCollection(listInteger);
printCollection(listString);
}
public static void printCollection(Collection<Object> collection){
for(Object obj:collection){
System.out.println(obj);
}
}
}
- 无边界的通配符
采用<?>的形式,比如 List<?>,无边界的通配符的主要作用就是让泛型能够接受未知类型的数据。通过该方案可以解决以上问题。在方法 printCollection(Collection<?> collection) 中不能出现与参数类型有关的方法比如 add方法; 。因为程序调用这个方法的时候传入的参数不知道是什么类型的,但是可以调用与参数类型无关的方法比如size方法 。
public class GernericTest {
public static void main(String[] args) throws Exception{
List<Integer> listInteger =new ArrayList<Integer>();
List<String> listString =new ArrayList<String>();
printCollection(listInteger);
printCollection(listString);
}
public static void printCollection(Collection<?> collection){
for(Object obj:collection){
System.out.println(obj);
}
}
}
- 固定上边界的通配符
使用固定上边界的通配符的泛型,就能够接受指定类及其子类类型的数据。要声明使用该类通配符,采用<? extends E>的形式,这里的 E 就是该泛型的上边界。
- 固定下边界的通配符
使用固定下边界的通配符的泛型,就能够接受指定类及其父类类型的数据。要声明使用该类通配符,采用<? super E>的形式,这里的 E 就是该泛型的下边界。
版权声明:本文为NWU_LK原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。