Java基础入门笔记07——泛型类

Java基础入门笔记07——泛型类泛型用来限制集合的存入类型:指定一种。(保证类型安全)Java中的泛型只在编译过程中生效,编译结束就清除相关信息,泛型信息不会进入运行阶段泛型的使用1.泛型类package study1118;public class Test01 { public static void main(String[] args) { //指定泛型为String A<String> a1 = new A<>(); a1.setKe

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

泛型

  • 用来限制集合的存入类型:指定一种——保证类型安全
  • Java中的泛型只在编译过程中生效,编译结束就清除相关信息,泛型信息不会进入运行阶段

泛型的使用

1.泛型类

package study1118;
						A	  T
//泛型类的定义 class 泛型名<类型> { }
//泛型类中所有类型都将会时新建泛型对象时,new的时候指定的那种类型
class A<T>{ 
   
    private T key;
    public void setKey(T key) { 
   
        this.key = key;
    }
    public T getKey(){ 
   
        return this.key;
    };
}

public class Test01 { 
   
    public static void main(String[] args) { 
   
        //新建一个泛型对象,指定泛型为String
        A<String> a1 = new A<>();
        a1.setKey("sadas");
        String s = a1.getKey();
        System.out.println(s);

        //新建一个泛型对象,指定泛型为Integer
        A<Integer> a3 = new A<>();
        a3.setKey(5);
        int i = a3.getKey();
        System.out.println(i);


        //新建一个泛型对象,若不定义泛型则默认泛型为Object
        A a2=new A();
        a2.setKey(new Object());
        Object key = a2.getKey();
        System.out.println(key);


        //同样的泛型类,在new对象时候,泛型指定不同的数据类型生成的泛型对象之间不能互相赋值
        //但进行赋值的类如果有泛型为Object的类则可以,涉及到自动转换类型
        
        a1=a3;//编译报错
        a3=a1;//编译报错
        a3=a2;//通过
    }
}

2.泛型接口

package study1118;

//泛型接口的定义
interface IB<T>{ 
   
    T test(T t);
    //接口中的方法默认都是抽象方法(没有方法体)
    //需要在实现类中进行重写
}

//实现接口IB的抽象方法时,如果未传入实参(此处的实参是某一种泛型),默认泛型为定义接口时所指定的类型
class B1<T> implements IB<T>{ 
   
    @Override
    public T test(T t) { 
   
        return t;
    }
}
//实现接口IB的抽象方法时,如果传入了指定泛型类型,则这个类实现接口的所有方法的参数都将指定为该泛型类型
class B2 implements IB<String>{ 
   
    @Override//重写方法的快捷键ctrl+O
    public String test(String s) { 
   
        return null;
    }
}

public class Test02 { 
   
    public static void main(String[] args) { 
   
//B1类和B2类用法上的区别

//新建B1类对象时候,需要指定泛型类型,若不指定会默认为Object类型,因为定义B1类时没有限制泛型,可以任意
    B1 objectB1 = new B1<Integer>();
    
//新建B2类对象时候,不需要指定泛型类型,因为定义B2类时已经限制了泛型(此处为String)
    B2 b2 = new B2();
    }
}

3.泛型方法

class C1{ 
   
// 定义泛型方法(无返回值的方法)
    public<T> void test(T s){ 
   
        T st = s ;
        
    }
// 定义泛型方法(有返回值,返回类型为T的方法) 
    public<T> T test1(T s){ 
   
        return s;
    }
    
    //有可变参数的方法
    public void test2(String... strs){ 
   
        for (String str : strs) { 
   
            System.out.println(str);
        }
    }
    //有可变参数的泛型方法
    public<T> void test3(T... strs){ 
   
        for (T str : strs) { 
   
            System.out.println(str);
        }
    }
}

泛型静态方法

class C2<E>{ 
   
    private E e;
    //在类上定义的泛型,可以在普通的方法中使用
    public <T> void test(T s){ 
   
        System.out.println(this.e);
    }
    //在类上定义的泛型,无法在静态方法中使用
    public static void test1(){ 
   
// System.out.println(this.e);//编译报错——因为无法从静态上下文中引用非静态 变量 this
    }
    
    // 静态方法如果要使用泛型,应该在定义静态方法时同时指明泛型
	public static<T> void test2(T t){ 
   
        System.out.println(t);

}

使用泛型方法的好处——动态数据类型

public class Test02 { 
   
    public static void main(String[] args) { 
   
        C2<Object> c = new C2<>();
        //泛型方法可以根据传入的参数数据类型来确定返回类型,意思就是数据类型是动态的,在调用方法时才会确定
        String s=c.test("xxx"); 
        Integer i=c.test(1);
        Boolean b=c.test(true);
        
    }
}

通配符——在不确定集合中的元素数据类型时,可以使用“?”来表示所有类型

package study1118;
import java.util.ArrayList;
import java.util.List;

class Dd{ 
   
    public void meth(List<?> list){ 
    }
    //假设有一个方法meth(),需要一个list集合的参数,但是目前不确定list中存的数据到底是什么类型,所以可以用"?"表示任意泛型
   

public class Test03 { 
   
    public static void main(String[] args) { 
   
        Dd dd = new Dd();
    
    //新建一个list集合,往里面丢两个字符串对象
    List<String> l1 = new ArrayList<>();
    l1.add("asas");
    l1.add("qqqq");
    dd.meth(l1);//此时meth方法就接收到了一个装有String数据类型的集合l1

	//新建一个list集合,往里面丢两个数字类型的对象
    List<Integer> l2 = new ArrayList<>();
    l2.add(50);
    l2.add(3);
    dd.meth(l2);//此时meth方法就接收到了一个装有Integer数据类型的集合l2 
   		 }
	}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168484.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • wsl2 ubuntu 20.04_卸载wsl ubuntu

    wsl2 ubuntu 20.04_卸载wsl ubuntu最近Ubuntu22.04正式发布了,我使用的Ubuntu还是WSL2中的20.04版本,故前来升级。不过坑确实比想象中的多,遂来尝试总结一下,希望能帮助到有需要的同学。不过其实最后,大家会发现,改国内源一把梭,啥问题都解决了::>_………

  • STL 源代码剖析 算法 stl_algo.h — merge sort「建议收藏」

    STL 源代码剖析 算法 stl_algo.h — merge sort

  • 闪讯pppoe拨号模块损坏118_创翼pppoe拨号模块损坏

    闪讯pppoe拨号模块损坏118_创翼pppoe拨号模块损坏创翼错误118pppope拨号模块损坏.1809版本、创翼的bug一、新建一个.txt文件二、复制下面代码到.txt文件里并保存WindowsRegistryEditorVersion5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog]”ServiceDll”=hex(2):25,00,…

  • 二十出头,老气横秋

    有的时候,我们希望年轻人成熟一点,不要巨婴,不要总是等着别人来解救,要自立,要有担当。但有时候吧,发现有些年轻人,似乎过于成熟了,二十来岁的人,感觉怎么就老气横秋的。1、…

  • spark处理大数据的几个实例介绍

    spark处理大数据的几个实例介绍在集群中跑应用,而不是在shell中感受写spark应用的过程整个过程为:1、案例分析:要用哪些spark的RDD的API2、编程实现:用到scala,3、提交到集群执行:如何提交到集群,文件是否先传到HDFS上4、监控执行结果:通过web可以看到介绍了四个案例:比如统计1千万个人的平均身高,如果用其他语言,估计要好几小时,因为磁盘读写,要反复计算用了sp

  • oracle split 分割字符串,Oracle字符串分割Split[通俗易懂]

    oracle split 分割字符串,Oracle字符串分割Split[通俗易懂]Oracle字符串分割Split一、创建数组类型Sql代码CREATEORREPLACETYPET_RET_TABLEISTABLEOFVARCHAR2(512)二、创建字符串分割函数Sql代码CREATEORREPLACEFUNCTIONF_SPLIT_STRING(AS_STRVARCHAR2,AS_SPLITVARCHAR2)RETURNT_RET_TABL…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号