java中泛型类是什么?类型通配符是什么?

BSO 2020-12-08 15:28:32 java常见问答 7140

上次已经为大家介绍过java泛型方法是怎样的有关内容了。今天要简述的也是与之相关的内容,也就是关于泛型类的有关知识。一起来了解一下吧。

首先我们需要知道的是,泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。

实例代码如下所示:

public class Box < T >
{
    private T t;
    public void add(T t)
    {
        this.t = t;
    }
    public T get()
    {
        return t;
    }
    public static void main(String[] args)
    {
        Box < Integer > integerBox = new Box < Integer > ();
        Box < String > stringBox = new Box < String > ();
        integerBox.add(new Integer(10));
        stringBox.add(new String("奇Q教程"));
        System.out.printf("整型值为 :%d\n\n", integerBox.get());
        System.out.printf("字符串为 :%s\n", stringBox.get());
    }
}

编译以上代码,运行结果如下所示:

整型值为: 10
字符串为: 奇Q教程

然后来了解一下,类型通配符

1、类型通配符一般是使用?代替具体的类型参数。例如List在逻辑上是List,List等所有List<具体类型实参>的父类。

实例代码如下所示:

import java.util.*;
public class GenericTest
{
    public static void main(String[] args)
    {
        List < String > name = new ArrayList < String > ();
        List < Integer > age = new ArrayList < Integer > ();
        List < Number > number = new ArrayList < Number > ();
        name.add("icon");
        age.add(18);
        number.add(314);
        getData(name);
        getData(age);
        getData(number);
    }
    public static void getData(List < ? > data)
    {
        System.out.println("data :" + data.get(0));
    }
}

输出结果为:

data: icon
data: 18
data: 314

解析:因为getData()方法的参数是List类型的,所以name,age,number都可以作为这个方法的实参,这就是通配符的作用。

2、类型通配符上限通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。

实例代码如下所示:

import java.util.*;
public class GenericTest
{
    public static void main(String[] args)
    {
        List < String > name = new ArrayList < String > ();
        List < Integer > age = new ArrayList < Integer > ();
        List < Number > number = new ArrayList < Number > ();
        name.add("icon");
        age.add(18);
        number.add(314);
        //getUperNumber(name);//1
        getUperNumber(age); //2
        getUperNumber(number); //3
    }
    public static void getData(List < ? > data)
    {
        System.out.println("data :" + data.get(0));
    }
    public static void getUperNumber(List < ? extends Number > data)
    {
        System.out.println("data :" + data.get(0));
    }
}

输出结果如下所示:

data: 18
data: 314

解析: 在(//1)处会出现错误,因为getUperNumber()方法中的参数已经限定了参数泛型上限为Number,所以泛型为string是不在这个范围之内,所以会报错。

3、类型通配符下限通过形如List来定义,表示类型只能接受Number及其三层父类类型,如Object类型的实例。

上面的内容已经详细为大家解析了java中泛型类是什么以及类型通配符是什么的主要内容了。具体的知识还是很好理解的。如果你对java知识感兴趣,想要了解更多java常见问题,敬请关注奇Q工具网。

推荐阅读:

java中泛型集合算法以及其他集合,详细解析

java泛型,泛型的高级用法详解

java泛型,泛型方法详解