学习笔记,仅供参考,有错必纠
泛型类
泛型类概述
泛型类,就是在定义类时,在类名后加一个尖括号:
public class 类名<泛型类型1,…>
//一般泛型会设置为一个大写字母,比如<T>等等
需要注意的是,泛型类型必须是引用类型。在我们定义这个泛型时,该泛型并没有明确的数据类型,但是当我们创建该类对象时,我们指定的泛型类型是啥(比如<Person>
),这个泛型类型<T>
就是啥。
比如,在我们创建ArrayList对象时,我们指定泛型为<Person>
,那我们就只能在其中添加Person类型的元素,而不能添加其他类型的元素(比如String, Integer等等),否则会在编译时报错:
package com.guiyang.restudy3;
import java.util.ArrayList;
import java.util.Iterator;
import com.guiyang.bean.Person;
public class D1Genric {
public static void main(String[] args) {
ArrayList<Person> list = new ArrayList<Person>();
list.add(new Person("张三", 23));
list.add(new Person("李四", 24));
Iterator<Person> it = list.iterator();
while(it.hasNext()) {
Person p = it.next();
System.out.println(p.getName() + "..." + p.getAge());
}
}
}
- 自定义泛型类
package com.guiyang.object;
public class Tool<Q> {
private Q q;
public Q getobj() {
return q;
}
public void setobj(Q q) {
this.q = q;
}
}
泛型方法
- 泛型方法概述
具有一个或多个类型变量的方法,称之为泛型方法。泛型方法可以存在于泛型类中,也可以存在于非泛型类中。泛型方法最好与类的泛型一致,如果不一致,需要在方法上声明该泛型。
简而言之,泛型方法,就是把泛型定义在方法上的方法。
- 定义格式
public <泛型类型> 返回类型 方法名(泛型类型 变量名)
- 自定义泛型类,非静态泛型方法,静态泛型方法
package com.guiyang.object;
public class Tool<Q> {
private Q q;
public Q getobj() {
return q;
}
public void setobj(Q q) {
this.q = q;
}
public<T> void show(T t) {
System.out.println(t);
}
public static<W> void print(W w) {
System.out.println(w);
}
}
注意!非静态泛型方法的泛型可以与类的泛型类型一致,也可以不一致。但是静态泛型方法的泛型类型必须与类的泛型类型不一致,否则,会在编译时报错。(妈呀,这句话好绕口)
类泛型 <Q>
会在Tool类创建对象时被赋值,而静态方法的泛型 <W>
,会在我们用类名调用静态方法时被赋值。
泛型接口
- 泛型接口概述
简而言之,泛型接口就是把泛型定义在接口上的接口。
- 定义格式
public interface 接口名<泛型类型>
- 自定义泛型接口
实现接口方式1(推荐):
interface Inter<T> {
public void show(T t);
}
class Demo implements Inter<String> {
@Override
public void show(String t) {
System.out.println(t);
}
}
我们创建Demo类实现了Inter接口,并制定泛型为 <String>
,此时,我们重写的show方法的泛型也应该是<String>
,这是因为,Inter接口的show方法的泛型与Inter接口泛型是一致的,而Demo类实现了该接口,就应该遵从这种规则。
实现接口方式2(不推荐):
interface Inter<T> {
public void show(T t);
}
class Demo<T> implements Inter<T> { //没有必要在实现接口的时候给自己加泛型
@Override
public void show(T t) {
System.out.println(t);
}
}
泛型通配符
- 泛型通配符是啥?
泛型通配符就是 <?>
,如果在开发过程中,我们不确定右边接收的泛型类型,则我们可以先将左边的泛型类型用?
来代替,这个?
代表的就是任意类型,比如:
List<?> list = new ArrayList<String>();
//或
List<?> list = new ArrayList<Integer>();