这个Java泛型不太正经
一、前言
泛型在java中有很重要的地位,在实际开发中用处也很大。
二、泛型
泛型:是jdk5中引入的特性,他提供编译是类型是类型的安全检测机制,这个机制允许在编译时检测到非法的类型,它的本质是参数化类型,也就是所操作的数据类型不变指定为一个参数
将原来具体的类型参数化,然后再使用/调用的时候传入具体的参数
泛型的类型:
①:泛型类
②:泛型方法
③:泛型接口
三、泛型定义的格式:
<类型> :指定一种类型的格式,这里的类型可以看成是形参。
<类型1,类型2...>:指定多种类型的格式,多种类型之间用逗号隔开,这里的类型类型1,类型2可以看成是形参,将来具体调用的时候的参数看成是实参,这里的泛型只能是引用类型。
什么是引用类型?
除了八大基本类型其他的都是引用类型,如基本类型对应的包装类
- boolean -->boolean
- char --->character
- byte -->byte
- short -->short
- int -->integer
- long -->long
- float -->float
- double -->double
泛型的好处是:
- 把运行得问题提前到编译时期
- 避免了强制转换
没指定类型默认是object类型
举个例子,当没有使用泛型时:
import java.util.hashmap; import java.util.map; import java.util.set; public class 泛型demo { public static void main(string[] args) { //创建一个对象 map map=new hashmap(); //添加数据 map.put(1, "张三"); map.put(2, "李四"); map.put(3,"王五"); map.put(5, 6);//加了不一样的类型数据 //键的集合 set keyset=map.keyset(); //键找值 for(object key: keyset){ string value=(string)map.get(key); system.out.println(key+":"+value); } } }
报了一个类型转换异常(int会自动转化成integer),integer不能转为string
exception in thread "main" java.lang.classcastexception: java.lang.integer cannot be cast to java.lang.string
此时泛型的好处就体现出来了,将运行时会出现的错误拉到了编译期间。
当然也可以在输出是采用object接收
//键的集合 set keyset=map.keyset(); //键找值 for(object key: keyset){ object value=map.get(key); // string value=(string)map.get(key); system.out.println(key+":"+value); }
这样也可以得到想要的结果。
四、泛型类
泛型类的定义格式:
修饰符 class 类名<类型> { }
举例:
public class generic<t>{}
这里的t可以使任意标识,常见的如t、e、k、v等形式常用于表示泛型。
泛型类下
public class generic<t> { //定义一个变量,提供get set方法 private t t; public t gett(){ return t; } public void sett(t t){ this.t=t; } }
测试类下
public class genericdemo { public static void main(string[] args) { generic<string> g1=new generic<>(); g1.sett("章三"); system.out.println(g1.gett()); system.out.println("------------------"); generic<integer> g2=new generic<>(); g2.sett(100); system.out.println(g2.gett()); } }
运行结果
定义这个泛型类的好处就是可以在测试中输入各种你想要的类型。
五、泛型方法
定义泛型方法的格式:
修饰符 <类型> 返回值类型 方法名 (类型 类型名)
举例:
public <t> void show (t t){}
泛型方法
public class generic { public <t> void show(t t){ system.out.println(t); } }
泛型方法测试下:
public class genericdemo { public static void main(string[] args) { generic g=new generic(); g.show("张三"); g.show(100); g.show(true); g.show(null); } }
运行结果
泛型方法比泛型类方便许多,直接在这使用即可,可以用个中类型的参数
六、泛型接口
格式:修饰符 interface 接口名<类型>{}
举例:
public interface generic<t>{}
既然是接口那就得定义一个类 去实现这个接口
泛型接口:
public interface generic<t>{}
genricimp类下:
public class genricimp<t> generic<t>{ public void show(t t){ system.out.println(t); } }
genricdemo类下:
public class genricdemo{ public static void main(string[]args){ generic<string> g1=new genericimp<string>(); g1.show("张三"); generic<integer> g2=new genericimp<integer>(); g2.show(100); } }
七、类型通配符
<? extends t>上限通配,?表示是t的一个未知子类。
<? super t>下限通配,?表示是t的一个未知父类。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
上一篇: Go语言开发redis封装及简单使用详解