Java基础---泛型

64 阅读2分钟

推荐课程—>B站黑马点这里

Java—泛型

======================================================================

1.泛型概述


泛型其实就是一种参数化的集合,它限制了你添加进集合的类型。泛型标志就是一种参数化类型。多态也可以看作是泛型的机制。一个类继承了父类,那么就能通过它的父类找到相应的子类,但是不能通过其他类来找到具体要找的这个类。泛型的设计之处就是希望对象或方法具有最广泛的表达能力。

下面看一个例子说明没有泛型的用法:

List arrayList = new ArrayList();

arrayList.add("cxuan");

arrayList.add(100);

for(int i = 0; i< arrayList.size();i++){

String item = (String)arrayList.get(i);

System.out.println("test === ", item);

}

这段程序不能正常运行,原因是Integer类型不能直接强制转换为String类型。查询运行后显示报错:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

我们用泛型进行改写后,示例代码如下:

List arrayList = new ArrayList();

arrayList.add(100);

这段代码在编译期间就会报错,编译器会在编译阶段就能帮我们发现类似这样的问题。

2.泛型的使用


2.1用泛型表示类

泛型可以加到类上面,来表示这个类的类型。

定义格式:

修饰符 class 类名<代表泛型的变量> { }

//此处T可以随便写为任意标识,创建的T,E,K,V等形式的的参数常用于表示泛型

public class Student {

//value这个成员变量的类型为T,T的类型由外部指定

private T value;

public Student(T value) {

this.value = value;

}

public Student() {

}

//泛型方法getKey的返回值类型为T,T的类型由外部指定

public T getValue() {

return value;

}

public void setValue(T value) {

this.value = value;

}

}

2.2用泛型表示接口

泛型接口与泛型的定义及使用基本相同。

一般泛型接口常用于生成器(generator)中,生成器相对于对象工厂,是一种专门用来创建对象的类。

定义格式:

修饰符 interface 接口名<代表泛型的变量> { }

//定义一个泛型接口

public interface Student{

public T ppp();

}

2.3用泛型表示方法

定义格式:

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }

public class GenericMethods {

public void f(T x){

System.out.println(x.getClass().getName());

}

}

2.4泛型通配符

当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。

此时只能接受数据,不能往该集合中存储数据。

public class Hello {

public static void main(String[] args) {

List name = new ArrayList<>();

List age = new ArrayList<>();

List number = new ArrayList<>();

name.add("小皮皮");