Java中原始类型、泛型、无限通配类型

时间:2022-09-20 19:22:44

前言:

如何通过泛型,消除Type safety的警告,使得代码更优雅?本文将介绍Java对象的三种类型,了解三中类型的区别,根据情境,灵活运用。

一.原始类型

List<>为原始类型,但不指定元素类型,会出现不安全的警告:List is a raw type. References to generic type List<E> should be parameterized,意思为:List是原始类型。List的泛型类型的引用应该被参数化。就是让人指定清楚是那种类型(如:Integer、String)

private void addObjIntoList1(List list, Object  obj) {
        list.add(obj);//出现警告,但编译能通过,能运行
    }

为了消除警告,往往使用注解@SuppressWarnings("unchecked")来关闭警告,但更优雅的办法是通过泛型。

二.泛型

List<T>为泛型,对于List中元素不确定时候,应使用泛型,保证安全性。

推荐使用以下写法消除Type safety类型安全的警告。

private <T extends Object>void addObjIntoList(List<T> list, T  obj) {
        list.add(obj);没有警告,编译能通过,也能运行
    }

三.无限通配类型

Set为例,Set是原始类型,Set<?>就是无限通配类型。

注:List<?>一般只用于读取情景中,不能add增加元素,除非是null

以下代码list.add(obj)会报错:
The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (Object)

private void addObjIntoList2(List<?> list, Object  obj) {
        list.add(obj);//编译不通过,不能运行
    }