java零基础入门-泛型(下篇)

139 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

哈喽,各位小伙伴们好,我是喵手。

今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流学习,互相学习,才能成长的更快,对吧。

我是一名java开发,所以日常接触到最多的就是java啦,所以我趁自己有空,就来好好回忆,把自己学到的会的,进行输出,不图什么有回报,只想能帮助到更多的小伙伴,就好。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对喵手我创作道路上最好的鼓励与支持!

一、前言

       论前几期啊,我们是分别讲了Object类Date类FormDate类Calendar类System类StringBuilder类,不知道大家掌握的如何,如果没有及时巩固的同学,可以看我这里,我给大家罗列了下,快速学习通道,只希望能帮助到大家更好的学习与成长,这就是我写作的初衷。

       上一期我们是讲了泛型的上半部分,不知道你们学的咋样,现在我要把泛型的下半部分给讲掉,如果有小伙伴没有掌握,可以去看我上篇的教内容,然后再来看我的这一期,好吧?

       我们在集合中基本都会使用到泛型,那么这一期,我们来把泛型知识学完整吧。

       泛型,我们都知道可灵活运用的将数据类型应用到不同的类、接口及方法中。并且将数据类型作为参数进行传递。

二、泛型的定义与使用

1️⃣定义和使用含有泛型的类

       那么定义一个含有泛型的类?并且使用它?这个对于你们而言,简单,但是你得先看我写的,我会教你。

定义泛型类的格式:

修饰符 class 类名<代表泛型的变量> {

}

举个例子,具体如下:

class ArrayList<E> { 

    //添加方法
    public boolean add(E e){
     
    }
    //获取方法
    public E get(int index){
     
    }
}

注意:在你创建对象的时候确定泛型。

例如使用上方的ArrayList类:

ArrayList<Integer> list = new ArrayList<Integer>();

看上方创建了一个ArrayList对象,其变量E就是Integer类型,我们其实就能这么理解:

class ArrayList<Integer>{ 
     public boolean add(Integere){
            //
     } 
     public String get(int index){
           //
     }
}

再比如:

ArrayList<String> list = new ArrayList<String>();

其他也是一样的。我就不一一举例啦。

2️⃣含有泛型的方法

      我们说除了带有泛型的类,还有方法,那么定义一个带有泛型的方法得怎么实现呢?

定义泛型方法的格式:

修饰符 <代表泛型的变量> 返回值类型 方法名(参数){
    //
}

举个例子,具体如下:

public class MyGenericMethod {
public <R> void run(R r) {
    System.out.println(r.getClass());
    }

public <R> R jump(R r) {
    return r;
    } }

那定义好了,该如何使用该方法呢?

具体请看我实例演示:

public static void main(String[] args) {

    //创建对象
    MyGenericMethod myGenericMethod = new MyGenericMethod();

    //演示看方法提示
    myGenericMethod.run(100);

    String jump = myGenericMethod.jump("我会跳!");
    System.out.println(jump);
}

​具体运行截图:

3️⃣含有泛型的接口

       除了带有泛型的类、方法,还有接口,它也可以带有。

定义泛型接口的格式:

修饰符 interface接口名<代表泛型的变量> {  }

举个例子,具体如下:

public interface MyGenericInterface<R> {
    public abstract void add(R r);
    public R getR();
}

都知道是接口,那使用的话,我们就得实现该接口,使用implements关键字。

此时,你在实现的时候,就得确定泛型R,比如我定义为Integer。

public class MyGenericInterfaceImpl implements MyGenericInterface<Integer> {

    @Override    public void add(Integer integer) {
        //
    }

    @Override
    public Integer getR() {
        //
        return null;
    }
}

当然,你一样也可以在创建对象时确定泛型。

举个例子,具体如下:

public class MyGenericInterfaceImpl2<R> implements MyGenericInterface<R> {

    @Override
    public void add(R r) {
        //
    }

    @Override
    public R getR() {
        //
        return null;
    }
}

所以,你要在创建该MyGenericInterfaceImpl2 对象时,就需要确定泛型了。

比如:

public static void main(String[] args) {
    
    //创建对象
    MyGenericInterfaceImpl2<String> impl2 = new MyGenericInterfaceImpl2<String>();
    impl2.add("添加啦");
}

三、泛型通配符

       那讲到这里,我就要科普一个新东西了,通配符。当你使用泛型类或泛型接口时,传递的数据中,泛型类型不确定,你就可以用通配符<?>表示。但是一旦使用泛型的统配符,只能用Object类中的共性方法了,集合中元素自身的方法也无法使用。

1️⃣基本使用

       泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。

此时只能接受数据,不能往该集合中存储数据。 

举个例子,大家请看:

public static void main(String[] args) {

    Collection<String> list1 = new ArrayList<>();
    getElement(list1);

    Collection<Integer> list2 = new ArrayList<>();
    getElement(list2);
}

//?代表可以接收任意类型
public static void getElement(Collection<?> coll) {}

       然后还有一部分,作为高级部分,我打算放在后期再更, 涉及到泛型的上限,下限等。

​​​​... ...

       好啦,以上就是本期内容的全部教学内容啦,如果对文中的任何知识点有疑问,欢迎评论区评论留言呀,我看见都会一一解答的。

四、结尾

       教学是结束了,但是有些话不知我但讲不当讲,啊哈哈, 可我还是想说给你们听听。如下是我很喜欢的一句话,我打算送给你们,希望我们都能变得更好更优秀。

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

-------------------------------------------

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

-------------------------------------------