0%

java | 泛型

范型的介绍和使用。

简单介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.redisc;


import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;

public class Test {


public static void main(String[] args) {

ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("123");
}
}

<String> 就是泛型。

泛型

范型类格式

1
2
3
修饰符 class 类名<泛型变量>{

}

泛型变量建议用 E、 T、 K、 V

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.redisc;


class MyList<E> {
public void add(E e) {

}
}

public class Test {


public static void main(String[] args) {

MyList<String> myList = new MyList<>();
myList.add("123");

}
}

泛型方法

定义格式

1
2
3
修饰符 <泛型变量> 返回值类型 方法名称(形参列表){

}

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.redisc;

public class Test {

public static <T> String arrToString(T[] nums) {
StringBuilder sb = new StringBuilder();
sb.append("[");
if (nums != null && nums.length > 0) {
for (int i = 0; i < nums.length; i++) {
T ele = nums[i];
sb.append(ele + ",");
}
}
sb.append("]");
return sb.toString();
}

public static void main(String[] args) {
Integer[] nums = {10, 20};
String s = arrToString(nums);
System.out.println(s);

}
}

泛型接口

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
package com.redisc;

interface Animal<E>{
void add(E animal);
}

class Cat{
String name;
String skill;
}

class CatData implements Animal<Cat>{

@Override
public void add(Cat animal) {

}
}

public class Test {

public static void main(String[] args) {

}
}

提供一个接口可以约束完成一些数据的行为。

泛型通配符

泛型没有继承关系。

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
package com.redisc;

import java.util.ArrayList;

class Animal {

}

class Car extends Animal {

}

class Doge extends Animal {

}

public class Test {

public static void run(ArrayList<Animal> animals){

}

public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();

run(cars); // 报错
}
}

通配符 ? 在使用泛型时代表一切类型。

通配符 ETKV 在定义泛型的时候代表一切类型。

将代码改成

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
package com.redisc;

import java.util.ArrayList;

class Animal {

}

class Car extends Animal {

}

class Doge extends Animal {

}

public class Test {

public static void run(ArrayList<?> animals){

}

public static void main(String[] args) {
ArrayList<?> cars = new ArrayList<>();

run(cars);
}
}

但是,? 代表的太过于宽泛,比如,上面的 animals 可以是任意类型。

所以,要对 ? 加上限定 extends

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
package com.redisc;

import java.util.ArrayList;

class Animal {

}

class Car extends Animal {

}

class Doge extends Animal {

}

public class Test {

public static void run(ArrayList<? extends Animal> animals){

}

public static void main(String[] args) {
ArrayList<Car> cars = new ArrayList<>();

run(cars); // 报错
}
}
请我喝杯咖啡吧~