1 泛型接口
1.1 接口定义
interface 接口名称<泛型标识>{}
1
2
3
4
5
|
// 在接口上定义泛型
interface Info<T>{
// 定义抽象方法,抽象方法的返回泛型类型的值
public T getVar() ;
}
|
1.2 接口实现
1.2.1 在子类的定义上也声明泛型类型
1
2
3
4
5
6
7
8
9
10
11
12
13
|
interface Info<T>{
public T getVar() ;
}
// 定义泛型接口的子类
class InfoImpl<T> implements Info<T>{
private T var ;
public InfoImpl(T var){
}
public T getVar(){
return this.var ;
}
}
|
1.2.2 实现接口直接指定具体的操作类型
1
2
3
4
5
6
7
8
9
10
11
12
13
|
interface Info<T>{
public T getVar() ;
}
// 定义泛型接口的子类
class InfoImpl implements Info<String>{
private T var ;
public InfoImpl(T var){
}
public T getVar(){
return this.var ;
}
}
|
2 泛型方法
2.1 定义
[访问权限] <泛型标识> 泛型标识 方法名([泛型标识 参数名]){}
1
2
3
4
5
6
|
class GenericMethod{
// 可以接收任意类型的数据
public <T> T methodA(T t){
return t ;
}
}
|
2.2 示例
通过泛型方法返回泛型类的实例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
// 指定上限,只能是数字类型
class Info<T extends Number>{
private T var ;
public T getVar(){
return this.var ;
}
public void setVar(T var){
this.var = var ;
}
}
class GenericMain {
public static void main(String args[]) {
Info<Integer> i = fun(30);
System.out.println(i.getVar());
Info<Integer> i1 = new Info<Integer>() ;
i1.setVar(1);
Info<Integer> i2 = new Info<Integer>() ;
i2.setVar(2);
add(i1,i2);
}
public static <T extends Number> Info<T> fun(T param) {
// 实例化Info
Info<T> temp = new Info<T>();
temp.setVar(param);
return temp;
}
public static <T extends Number> void add(Info<T > i1,Info<T> i2){
System.out.println(i1.getVar() + " + " + i2.getVar()) ;
}
}
|
3 泛型数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class GenericArray{
public static void main(String args[]){
Integer i[] = fun(1,2,3,4) ;
print(i) ;
}
// 接收可变参数
public static <T> T[] fun(T...arg){
return arg ;
}
public static <T> void print(T param[]){
for(T t:param){
System.out.print(t + "、") ;
}
}
}
|
4 泛型继承
4.1 子类的泛型参数和父类的参数一致
最常用的继承
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Father<T> {
T data;
public Father(T data) {
this.data = data;
}
@Override
public String toString() {
return "Father data = "+ data;
}
}
class Son<T> extends Father<T> {
public Son(T data) {
super(data);
}
@Override
public String toString() {
return "Son1 data=" + data;
}
}
|
4.2 子类增加了一个泛型参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Father<T> {
T data;
public Father(T data) {
this.data = data;
}
@Override
public String toString() {
return "Father data = "+ data;
}
}
class Son<E, T> extends Father<T> {
E other;
public Son(T data, E other) {
super(data);
this.other = other;
}
@Override
public String toString() {
return "Son otherData=" + other + ", data=" + data;
}
}
|
4.3 继承时指定父类的泛型参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class Father<T> {
T data;
public Father(T data) {
this.data = data;
}
@Override
public String toString() {
return "Father data = "+ data;
}
}
class Son extends Father<Integer> {
public Son4(Integer data) {
super(data);
}
@Override
public String toString() {
return "Son data=" + data;
}
}
|
4.4指定父类的泛型,子类又增加了自己的泛型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Father<T> {
T data;
public Father(T data) {
this.data = data;
}
@Override
public String toString() {
return "Father data = "+ data;
}
}
class Son<T> extends Father<Integer> {
T other;
public Son(Integer data, T other) {
super(data);
this.other = other;
}
@Override
public String toString() {
return "Son other=" + other + ", data=" + data;
}
}
|
4.5 接口继续,接口实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
//用户基础接口
public interface UserBaseService<T extends UserBase> {
void save(T user);
void common(T user);
}
//用户接口
public interface UserService<T extends UserBase> extends UserBaseService<T>{
void userSelfMethod();
}
//基础接口实现类
public abstract class UserBaseServiceImpl<T extends UserBase> implements UserBaseService<T> {
void common(T user){
save(user);
}
}
//用户基础基础接口实现,实现用户接口
public class UserServiceImpl extends UserBaseServiceImpl<User> implements UserService<User>{
void save(User user){
}
void userSelfMethod(){
}
}
|
4.6 通配符
- <? extends T>是指 “上界通配符(Upper Bounds Wildcards)“
元素类型都是T的子类(包含本身),禁止做插入操作,只做读取
- <? super T>:是指 “下界通配符(Lower Bounds Wildcards)”
元素都是T的父类(包含本身),只能对这个泛型做插入操作,而无法读
本文为学习记录,因能力有限,如有错误请赐教……如需转载,请注明出处!