Java里的泛型

这是我参与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 就会贴心的提示:
image.png
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();

    }
}
复制代码

运行结果:
image.png

结合一些方法的重写,比如重写一下 Comparable 方法,然后就可以实现自定义比较了。

Python里面的话,如果是函数传参,并不需要我们指定类型。隐隐的就实现了泛型的方法。

在高版本里,新增了提示。比如 LeetCode 定义函数后,括号内写了 num 的类型是 int。
image.png

求助 Moment

最近经常搞不清:
map.get(index);
之后,我就希望这个能自己打印出来。但其实是需要用 System.out.println 包裹才可以打印出来。

每次都是看到结果才反应过来:哦,怎么什么都没打印出来。
这样,才回过头来改正。

如果有高手有类似的心理,求教呀~