首先请看如下代码:
public class generictype {
public static void main(String str[]) {
Hashtable h =new Hashtable();
h.put(1, "String类型");
int a = (String) h.get(1);
System.out.println(a);
}
}
//执行结果
String类型
//如果我们将上述由红色标出的String改为int执行后结果如下(更改后编译没有错误):
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at genetictype.generictype.main(generic1.java:10)
以上就是强制类型转换可能带来的典型错误,然而这个错误在编译期间无法知道,以至于在运行期间jvm检查后抛出类型转换异常。
再看下述代码:
public class generictype {
public static void main(String str[]) {
Hashtable<Integer, String> h = new Hashtable<Integer, String>();
h.put(1, "String类型");
String a= h.get(1);
System.out.println(a);
}
}
//执行结果
string类型
//需要提出的是1.上述由红色标出的String如果改为int,在编译的时候会报错
2.在h.get(1)前面不需要再进行强制类型转换。
综上看来泛型的作用为:
1.就是是在编译的时候检查类型的安全(解决java中强制类型转换可能导致的错误),交给了编译器巨大的使命。
2.提高代码的重用率
类型擦除:
类型擦除就是说编译器编译.java文件时,将类的泛型参数去掉,那么jvm加载字节码文件的时候对泛型不可见,这个过程就称为类型擦除。
与类型擦除有关的现象:
(1) 泛型类没有Class的类类型。比如并不存在List<String>.class或是List<Integer>.class,而只有List.class。
(2) 静态变量是被泛型类的所有实例所共享的。
public class generictype
{
public static void main(String str[]){
test1<String> t = new test1<String>();
test1<Date> tt = new test1<Date>();
System.out.println(t.a);
System.out.println(tt.a);
}
}
class test1<T>{
static int a = 1;
}
//结果
1
(3) 泛型的类型参数错误不能通过异常处理,因为异常处理是jvm实现的,而jvm加载的字节码文件已经擦除了泛型特征,这也间接的说明了泛型的意义:在编译期间发现参数类型错误。
类型擦除的基本过程也比较简单:
1.将类型参数用顶级父类替换,这类一般是Object,如果指定了类型参数的上界的话,则使用这个上界。
2.去掉出现的类型声明,即去掉<>的内容。
例如:T get()方法声明就变成了Object get();List<String>就变成了List。接下来就可能需要生成一些桥接方法(bridge method)。这是由于擦除了类型之后的类可能缺少某些必须的方法。比如考虑下面的代码:
public class generictype {public static void main(String str[]) {
test3 t =new test3();
t.getT("11111");
}
}
interface test2<T>{
public T getT(T t);
}
class test3 implements test2<String>{
public String getT(String t){
return t;
}
}
//类型擦除后的代码
public class generictype {
public static void main(String str[]) {
test3 t = new test3();
t.getT("11111");
}
interface test2 {
public Object getT(Object t);
}
class test3 implements test2 {
public String getT(String T){
return T }
public Object getT(Object t) {
return this.getT((String) t);
}//如果没有这段代码,在类型擦除后test3没有重写接口test2的抽象方法,明显错误,因此编译器的巨大作用就是在这里帮忙生成了该方法,同时编译器也依靠该功能完成检错任务。
}
泛型的分类:泛型类,泛型接口,泛型方法,泛型异常
泛型类
public class generictype {
public static void main(String str[]) {
test<Integer, String> t = new test<Integer, String>();
t.put(1, "str1");
t.put(2, "str2");
System.out.println(t.get(1));
System.out.println(t.get(2));
}
}
class test<T, V> {
public Hashtable<T, V> h = new Hashtable<T, V>();
public void put(T t, V v) {
h.put(t, v);
}
public V get(T t) {
return h.get(t);
}
}
//执行结果
str1
str2
多态方法(泛型方法):在函数名前定义泛型参数,可以在传入参数列表,返回值类型,方法体里面引用
public class generictype {
public <T> String getString(T obj){
return obj.toString();
}
public static void main(String str[]) {
generictype g =new generictype ();//不需要类的泛型
System.out.println(g.getString(1));
System.out.println(g.getString('a'));
System.out.println(g.getString("a"));
}
}
//执行结果
a
a
泛型异常(兼具泛型接口)
public class generictype {
public static void main(String str[]) {
TestException t =new TestException();
try {
t.excute(2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
//extends说明该泛型参数继承于Exception
interface TestExceptionInterface<T extends Exception>
{
public void excute(int i) throws T;
}
class TestException implements TestExceptionInterface<IOException>{
@Override
public void excute(int i) throws IOException {
if(i<10){
throw new IOException();
}
}
}
//意义:1.针对不同的可能出现的异常类型,定义自己的实现类。
2.定义多个实现类的时候,不用一个一个手动throws异常,提高了代码重用率
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# java
# 泛型
# 深入理解java泛型详解
# Java 泛型总结(三):通配符的使用
# Java 泛型总结(二):泛型与数组
# Java 泛型总结(一):基本用法与类型擦除
# 详解Java中的 枚举与泛型
# java数组、泛型、集合在多态中的使用及对比
# 浅谈java中定义泛型类和定义泛型方法的写法
# Java中泛型使用实例详解
# 擦除
# 自己的
# 的是
# 这是
# 变成了
# 加载
# 是在
# 在这里
# 多个
# 的说
# 不需要
# 这段
# 这也
# 给了
# 这类
# 如果没有
# 重写
# 再看
# 不需
# 报错
相关文章:
网站制作知乎推荐,想做自己的网站用什么工具比较好?
建站之星好吗?新手能否轻松上手建站?
模具网站制作流程,如何找模具客户?
C++如何使用std::optional?(处理可选值)
如何在景安服务器上快速搭建个人网站?
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何在七牛云存储上搭建网站并设置自定义域名?
怎么将XML数据可视化 D3.js加载XML
如何通过智能用户系统一键生成高效建站方案?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
济南企业网站制作公司,济南社保单位网上缴费步骤?
设计网站制作公司有哪些,制作网页教程?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
如何用AWS免费套餐快速搭建高效网站?
如何在腾讯云免费申请建站?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何基于云服务器快速搭建网站及云盘系统?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
湖北网站制作公司有哪些,湖北清能集团官网?
建站主机选哪种环境更利于SEO优化?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
如何通过山东自助建站平台快速注册域名?
如何通过VPS建站实现广告与增值服务盈利?
MySQL查询结果复制到新表的方法(更新、插入)
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
建站之星后台密码遗忘或太弱?如何重置与强化?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
Python路径拼接规范_跨平台处理说明【指导】
如何在宝塔面板中创建新站点?
定制建站流程步骤详解:一站式方案设计与开发指南
广东专业制作网站有哪些,广东省能源集团有限公司官网?
,怎么用自己头像做动态表情包?
宝塔建站教程:一键部署配置流程与SEO优化实战指南
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何在IIS中新建站点并配置端口与物理路径?
网站制作价目表怎么做,珍爱网婚介费用多少?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
建站主机与服务器功能差异如何区分?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
建站之星北京办公室:智能建站系统与小程序生成方案解析
*请认真填写需求信息,我们会在24小时内与您取得联系。