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基础---泛型的主要内容,如果未能解决你的问题,请参考以下文章