Java基础---泛型

Posted LL.LEBRON

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础---泛型相关的知识,希望对你有一定的参考价值。

推荐课程—>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<String> arrayList = new ArrayList<String>();
arrayList.add(100);

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

2.泛型的使用

2.1用泛型表示类

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

定义格式:

修饰符 class 类名<代表泛型的变量> {  }
//此处T可以随便写为任意标识,创建的T,E,K,V等形式的的参数常用于表示泛型
public class Student<T> {
	//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<T>{
    public T ppp();
}

2.3用泛型表示方法

定义格式:

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }
public class GenericMethods {
   public <T> void f(T x){
      System.out.println(x.getClass().getName());
   }
}

2.4泛型通配符

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

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

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

public class Hello {
    public static void main(String[] args) {
        List<String> name = new ArrayList<>();
        List<Integer> age = new ArrayList<>();
        List<Number> number = new ArrayList<>();
        name.add("小皮皮");
        age.add(20);
        number.add(337);
        generic(name);
        generic(age);
        generic(number);
    }

    private static void generic(List<?> data) {
        System.out.println(data.get(0));
    }
}
  • 上界通配符<? extends ClassType>该通配符为ClassType的所有子类型。它表示的是任何类型都是ClassType类型的子类。
  • 下界通配符<? super ClassType>该通配符为ClassType的所有超类型。它表示的是任何类型的父类都是ClassType
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}

// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}

以上是关于Java基础---泛型的主要内容,如果未能解决你的问题,请参考以下文章

JAVA基础之“泛型”

学习笔记Java基础知识——泛型与集合

一个小栗子聊聊JAVA泛型基础

Java基础:泛型

Java基础总结泛型

java基础--泛型