java复习

2020-06-29泛型

2020-06-29  本文已影响0人  智障猿

泛型

泛型类

泛型方法

泛型接口

//接口
public interface Teach<T> {
    void teach(T t);
}
//接口实现类
public class TeachImpl<T> implements Teach<T> {
   //重写接口中的泛型方法
    @Override
    public void teach(T t) {
    }
}

类型通配符

当声明一个方法时,某个形参的类型是一个泛型类或泛型接口类型,但是在声明方法时,又不确定该泛型实际类型,可以考虑使用类型通配符。

  1. 方式一:声明一个泛型方法
public static void test1(List<Object> c){
        for (int i = 0; i < c.size(); i++) {
            System.out.println(c.get(i));
        }
    }

这样的形参太局限了,只能传入 List<Object> 类型的实参。

  1. 方式二:声明一个泛型方法
public static <T> void test2(List<T> c){
        for (int i = 0; i < c.size(); i++) {
            System.out.println(c.get(i));
        }
    }

该方法需要声明泛型形参T。

  1. 方式三:使用类型通配符
public static void test3(List<?> c){
        for (int i = 0; i < c.size(); i++) {
            System.out.println(c.get(i));
        }
    }

那么方式二的泛型方法 test2() 和方式三的 test3() 使用类型通配符有什么区别?

test3方法带通配符的List仅表示它可以接受指定了任意泛型实参的List,并不能把元素加入其中,例如如下代码将会引起编译错误:

 public static void test(List<?> c, String str){
        c.add(str);
 }

因为我们不知道上面程序中c集合里元素的类型,所以不能向其中添加对象,除了null对象,因为它是所有引用数据类型的实例。

test2方法带泛型的List,表示该集合的元素类型是T,因此允许T系列的对象加入其中,例如如下代码是可行的:

public static <T> void test(List<T> c, T t){
    c.add(t);    
}

即如果不涉及添加元素到带泛型的集合中,那么两种方式都可以,如果涉及到添加元素到带泛型的集合中,使用类型通配符<?>的不支持。

上一篇下一篇

猜你喜欢

热点阅读