[访问权限] class 类名<泛型类型标识1,泛型类型标识2,.....,泛型类型标识n> {
[访问权限] 泛型类型标识 变量名称;
[访问权限] 泛型类型标识 方法名称(){}
[访问权限] 返回值类型声明 方法名称(泛型类型标识 变量名称){}
}
- 示例
// 一个类只指定一个泛型类型
public class User<T> {
private T t;
public T getter() {}
public void setter(T t){}
}
// 一个类中指定多个泛型类型
public class Node<k,V> {
private K key;
private V value;
public K getter() {}
public void setter(V v){}
}
2. 泛型对象
User<Integer> user = new User<>();
2. 通配符
1. 泛型中的引用传递
注意:泛型类型间存在继承关系,声明的泛型对象并不存在继承关系
publicstaticvoidmain(String[] args){User<Integer> user =newUser<>();
user.setter(1);// 不能将User<Integer>类型传入User<Object>中,编译报错:无法传递,即使Integer继承Objectfunction(user);}publicstaticvoidfunction(User<Object> user){}
1. 定义类:[访问权限] 类名称<泛型标识 extend 类> {}
2. 声明对象:类名称<? extends 类> 对象名称。
示例:
1. 类定义时指定泛型上限
public class Info<T extends Number> {}
此时,声明的泛型对象只能是Number及其子类,Info<Integer> info = new Info<>();
2. 设置方法只能接受某上限的泛型类型
public void fun(Info<? extends Number> info){}
此时,方法接受的泛型对象只能是Number及其子类。fun(info<Integer>);
3. Son extends Father extends Human
List<? extends Father> list1 = new ArrayList<>();
Father father = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。
Human human = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。
Object object = list1.get(0);//读取出来的东西只能存放在Father或它的基类里。
// 要使用子类具体类型,必须强转
Son son = (Son)list1.get(0);
2. 泛型的下限
泛型下限使用supper关键字声明,表示泛型的类型可能是所指定的类型或者此类型的父类
super 用于参数类型限定时(传入的泛型对象的泛型类型只能是T及其父类,对super入参添加元素时只能添加T及其子类(如果允许添加父类,则泛型类型T可能会对应多个没有任何关系的父类))
super 用于返回类型限定时(返回的泛型对象类型只能是T及其父类,且获取时只能是Object接收)