- 泛型类
/*
当创建Person的对象时,需要指定类型,若不指定则默认Object类型,若制定为String类型,则在类Person中,T的位置全部换成String,即属性String ord;
*/
class Person<T>{
private String name;
//定义泛型类T
T ord;
public Person() {
}
public Person(String name, T ord) {
this.name = name;
this.ord = ord;
}
public void setOrd(T ord){
this.ord=ord;
}
public T getOrd(){
return ord;
}
}
- 泛型类的继承和泛型方法
/*
当创建子类SubPerson的对象时,若制定T为String,则父类中的所有T的位置和父类中T的位置全部换成String
也可以明确指定父类中泛型如class SubPerson<T> extends Person<String>
*/
class SubPerson<T> extends Person<T> {
T a;
public SubPerson() {
}
public SubPerson(T a) {
this.a = a;
}
//泛型方法,此处用泛型,便可以将任意类型的List放入其中实现多态
public <E> void getList(List<E> list) {
ArrayList<E> es = new ArrayList<>();
for (E e : list) {
es.add(e);
}
}
}
- 整体测试
package JavaFour;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName : CreateNormalTest //类名
* @Description : 自定义泛型 //描述
* @Author : Gao //作者
* @Date: 2022/3/1 21:17
*/
public class CreateNormalTest {
public static void main(String[] args) {
SubPerson<Integer> integerSubPerson = new SubPerson<>(1);
//调用父类的getOrd()方法,即表明子类在创建对象时也指明了父类的泛型情况
Integer ord = integerSubPerson.getOrd();
System.out.println(ord);
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(9888);
//调用泛型方法,便可以将Integer类型的传入方法中
List<Integer> list = integerSubPerson.getList(arrayList);
for (Integer integer : list) {
System.out.println(integer);
}
}
}
class Person<T> {
private String name;
//定义泛型类T
T ord;
public Person() {
}
public Person(String name, T ord) {
this.name = name;
this.ord = ord;
}
public void setOrd(T ord) {
this.ord = ord;
}
public T getOrd() {
return ord;
}
}
class SubPerson<T> extends Person<String> {
T a;
public SubPerson() {
}
public SubPerson(T a) {
this.a = a;
}
public <E> List<E> getList(List<E> list) {
ArrayList<E> es = new ArrayList<>();
for (E e : list) {
es.add(e);
}
return es;
}
}
- 通配符的使用
/*
若A是B的父类,但List<A>和List<B>并无父类关系
若想用多态则需要将其赋予带通配符的List<?>
注意:带赋值给带通配符的则不能添加数据
且取出的数据是Object类型的
*/
@Test
public void test(){
//
List<?> list = null;
List<String> list3 = new ArrayList<>();
list3.add("AA");
list3.add("BB");
list3.add("CC");
list = list3;
//添加(写入):对于List<?>就不能向其内部添加数据。
//除了添加null之外。
// list.add("DD");
// list.add('?');
list.add(null);
//获取(读取):允许读取数据,读取的数据类型为Object。
Object o = list.get(0);
}
- 带有类型限制的通配符
/*
<? extends Person> 只能是Peron的子类
<? super Person> 只能是Person的父类
*/
- 统配符合泛型方法
若只是对数据进行读则用通配符,若需要对数据进行修改则建议使用泛型方法。