Java 泛型的使用
一、定义泛型类
定义一个泛型类Meta 和 Dual
public class Meta<T> {
private T value;
public Meta(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
public class Dual<T, E> {
private T one;
private E two;
public Dual(T one, E two) {
this.one = one;
this.two = two;
}
public T getOne() {
return one;
}
public E getTwo() {
return two;
}
}
这样在使用时,更加传入的值灵活的匹配不同的类型,如下所示:
省略了强制转化,而且代码易读性更强
public static void main(String[] args) {
Meta<String> stringMeta = new Meta<>("字符串");
Meta<Integer> integerMeta = new Meta<>(123);
Meta<Boolean> booleanMeta = new Meta<>(true);
Meta<Class<String>> classMeta = new Meta<>(String.class);
Dual<Boolean, String> dual1 = new Dual<>(true, "简单元素");
Dual<Double, Long> dual2 = new Dual<>(1.023, 103L);
}
二、定义泛型方法
定义一个泛型方法, 在方法的返回值前面,添加
如果createDual的返回值<K,V>,那么返回值Dual.getOne()获取到的将会是Object类型,而不是自动匹配的类型
public class Modify {
public static <T> String toString(T type) {
return type.toString();
}
public static <K,V> Dual<K,V> createDual(K k,V v) {
return new Dual<>(k, v);
}
}
测试
public static void main(String[] args) {
System.out.println(Modify.toString(1008611));
System.out.println(Modify.toString(Arrays.asList("袁", true, null, 3333)));
System.out.println(Modify.toString(String.class));
Dual<Integer, String> dual = Modify.createDual(10086, "移动");
Integer one = dual.getOne();
String two = dual.getTwo();
System.out.println(Modify.toString(dual));
}
执行结果
1008611
[袁, true, null, 3333]
class java.lang.String
com.message.demo.generic.Dual@27bc2616
三、泛型接口
泛型接口与泛型类的定义类型,在接口名后面加上泛型类型即可
import java.util.List;
/**
* 雷电将军
* @param <T>
*/
public interface Barr<T> {
T first(List<T> list);
}
实现接口,及其测试
import java.util.Arrays;
import java.util.List;
/**
* 装备了天空枪的雷电将军
*/
public class SkyBarr<T> implements Barr<T>{
@Override
public T first(List<T> list) {
if (list.size() ==0 ) return null;
else return list.get(0);
}
public static void main(String[] args) {
SkyBarr<String> skyBarr = new SkyBarr<>();
String first = skyBarr.first(Arrays.asList("天", "空"));
// first 不能传递不是在实例化时指定的类型
// String first1 = skyBarr.first(Arrays.asList(1, 2, 3, 4));
System.out.println(first); // 输出 : 天
}
}
四、泛型通配符
可以是A-Z 之间的任何一个字母,本质上这些个都是通配符。不过通常情况下会有一下约定:
-
?表示不确定的 java 类型
-
T (type) 表示具体的一个java类型
-
K V (key value) 分别代表java键值中的Key Value
-
E (element) 代表Element

浙公网安备 33010602011771号