范型的介绍和使用。
简单介绍
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>
就是泛型。
泛型
范型类格式
泛型变量建议用 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); } }
|
通配符 ?
在使用泛型时代表一切类型。
通配符 E
、T
、K
、V
在定义泛型的时候代表一切类型。
将代码改成
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); } }
|