您的位置 首页 java

Java 里的泛型

泛型(generic)本质是数据类型的参数化。

泛型的声明位置,紧跟在类名后面,用<>包裹的:

 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 包裹才可以打印出来。

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

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

文章来源:智云一二三科技

文章标题:Java 里的泛型

文章地址:https://www.zhihuclub.com/182161.shtml

关于作者: 智云科技

热门文章

网站地图