likes
comments
collection
share

Java 核心知识总结 泛型

作者站长头像
站长
· 阅读数 39

🔥什么是泛型?泛型有什么作用?

Java语言是一门强类型的编程语言,即在编写时就必须明确变量的类型,否则编译不通过。Java语言的多态特性让我们可以把某些只能在运行时确定的类型在编译时使用父类或父接口表示,这确实解决了很多问题。但是有时程序员在声明某些变量时不知道它的具体父类或父接口,只能无奈地选择公共父类Object类型,这很不方便,如之前的集合就是这样的。为了解决这个问题,JDK 1.5引入了泛型的概念,让我们在程序中可以用某种方式表示完全未知的类型,使得程序顺利编写并通过编译,等到使用时再确定它的具体类型。泛型(Generics)指的就是泛化的类型,即用<T>等形式来表示一个未确定的类型。

泛型有三种使用方式:泛型类、泛型接口、泛型方法。当我们在类或接口中定义某个成员时,该成员的相关类型是不确定的,而这个类型需要在使用这个类或接口时才确定,我们可以使用泛型类、泛型接口。如果我们定义类、接口时没有使用泛型,但是某个方法形参类型不确定时,我们可以使用泛型方法。

以集合来举例,使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合,如整型集合类,浮点型集合类,字符串集合类,我们可以定义一个集合来存放整型、浮点型,字符串型数据,我们只要把底层存储元素设置为 Object 即可,添加的数据全部都可向上转型为 Object。

介绍一下泛型在继承上的使用

如果 B 是 A 的一个子类型(子类或者子接口),而 G 是具有泛型声明的类或接口,G<B> 并不是G<A> 的子类型。例如,String 是 Object 的子类,但是 List<String> 并不是 List<Object> 的子类。

Java 核心知识总结 泛型

介绍一下泛型中通配符的使用

当我们使用泛型却仍然无法确定具体类型时,可以使用类型通配符 ?。例如 List<?> 是 List<String>、List<Object> 等各种泛型 List 的父类。

使用通配符后的读写操作

将任意元素加入到其中不是类型安全的:

Collection<?> c = new ArrayList<String>();
c.add(new Object()); // 编译时错误

add 方法有类型参数 E 作为集合的元素类型。我们传给 add 的任何参数都必须是一个未知类型的子类。因为我们不知道那是什么类型,所以我们无法传任何东西进去。唯一可以插入的元素是 null,因为它是所有引用类型的默认值。

读取 List<?> 的对象中的元素时,永远是安全的:

public static void test(Collection<?> coll){
     for (Object o : coll) {
         System.out.println(o);
     }
}

因为不管 List 的真实类型是什么,它包含的都是 Object。

介绍一下有限制的通配符使用

  • :允许所有泛型的引用调用
  • 通配符指定上限,<? extends 类/接口 > :使用时指定的类型必须是继承某个类,或者实现某个接口,即 <=
  • 通配符指定下限,<? super 类/接口 >:使用时指定的类型必须是操作的类或接口,或者是操作的类的父类或接口的父接口,即 >=

例如:

 <? extends Pers>     // (无穷小, Person]
 // 只允许泛型为 Person 及 Person 子类的引用调用
 <? super Person>      // [Person, 无穷大)
 // 只允许泛型为 Person 及 Person 父类的引用调用
转载自:https://juejin.cn/post/7377439806136844340
评论
请登录