这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战。
泛型(generic)本质是数据类型的参数化。
菜鸟网站:
泛型是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的声明位置,紧跟在类名后面,用<>
包裹的:
class MyCollection <E> { // 相当于形式参数
Object[] objects = new Object[5];
public void set(E e, int index) {
objects[index] = e;
}
public E get(int index) {
return (E)objects[index];
}
}
复制代码
上面的代码,就使用了泛型。
在类里面,set 和 get 方法,还是有点细节不一样的。
- 第一个 set 方法,在 index 位置设置元素 e。e 的类型是 E。具体是什么呢,不用管。到时候定义的时候是什么就是什么。就是让 objects数组的索引 index 的格子里,放 e 的引用。
- 第二个 get 方法,返回的是 某个索引对应的元素,返回的类型是 E。return 实现的时候加了一个强制转换。
这样写的好处是,不用确定类型必须是什么,那就可以看我七十二变了对不对。我可以传基本的数据类型,也可以传复杂点的,定义一个类。
就非常灵活。是学 Java 的哇塞时刻。
代码
在上面定义好的基础上,来写 main()
的测试。
在第一行打好后,再 set,IDEA 就会贴心的提示:
set 方法里的参数需要的类型,就和第一句 MyCollection<>
尖括号这里的类型一致。
public class TestGeneric {
public static void main(String[] args) {
MyCollection<String> mc = new MyCollection<>(); // 相当于实际参
mc.set("fang",0);
mc.set("Kris",2);
String b = mc.get(2);
System.out.println("第 3 个元素:" + b);
//
// List list = new ArrayList();
// Map map = new HashMap();
}
}
复制代码
运行结果:
结合一些方法的重写,比如重写一下 Comparable
方法,然后就可以实现自定义比较了。
Python里面的话,如果是函数传参,并不需要我们指定类型。隐隐的就实现了泛型的方法。
在高版本里,新增了提示。比如 LeetCode 定义函数后,括号内写了 num 的类型是 int。
求助 Moment
最近经常搞不清:
map.get(index);
之后,我就希望这个能自己打印出来。但其实是需要用 System.out.println
包裹才可以打印出来。
每次都是看到结果才反应过来:哦,怎么什么都没打印出来。
这样,才回过头来改正。
如果有高手有类似的心理,求教呀~
近期评论