当前位置: 首页 > wzjs >正文

服装网站策划书北京网站设计确保代码符合w3c

服装网站策划书,北京网站设计确保代码符合w3c,本地环境建设网站,电脑网站微信支付怎么做的Java-泛型&通配符总结 泛型什么是泛型?有什么作用?泛型的使用方式有哪几种?项目中哪里用到了泛型?什么是泛型擦除机制?为什么要擦除?什么是桥方法?泛型有哪些限制?为什么?以下代…

Java-泛型&通配符总结

  • 泛型
    • 什么是泛型?有什么作用?
    • 泛型的使用方式有哪几种?
    • 项目中哪里用到了泛型?
    • 什么是泛型擦除机制?为什么要擦除?
    • 什么是桥方法?
    • 泛型有哪些限制?为什么?
    • 以下代码是否能编译,为什么?

泛型

什么是泛型?有什么作用?

Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。使用泛型参数,可以增强代码的可读性以及稳定性。

编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。比如 ArrayList<Persion> persons = new ArrayList<Persion>() 这行代码就指明了该 ArrayList 对象只能传入 Persion 对象,如果传入其他类型的对象就会报错。

ArrayList<E> extends AbstractList<E>

并且,原生 List 返回类型是 Object ,需要手动转换类型才能使用,使用泛型后编译器自动转换。

泛型的使用方式有哪几种?

泛型一般有三种使用方式:泛型类泛型接口泛型方法

  1. 泛型类
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Test<T>{private T key;public Test(T key) {this.key = key;}public T getKey(){return key;}
}

如何实例化泛型类:

Test<Integer> testInteger = new Test<Integer>(123456);
  1. 泛型接口
public interface Test<T> {public T method();
}

实现泛型接口,不指定类型:

class TestImpl<T> implements Test<T>{@Overridepublic T method() {return null;}
}

实现泛型接口,指定类型:

class TestImpl<T> implements Test<String>{@Overridepublic String method() {return "hello";}
}
  1. 泛型方法
  public static < E > void printArray( E[] inputArray ){for ( E element : inputArray ){System.out.printf( "%s ", element );}System.out.println();}

使用:

// 创建不同类型数组: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3 };
String[] stringArray = { "Hello", "World" };
printArray( intArray  );
printArray( stringArray  );

项目中哪里用到了泛型?

  • 自定义接口通用返回结果 CommonResult<T> 通过参数 T 可根据具体的返回类型动态指定结果的数据类型
  • 定义 Excel 处理类 ExcelUtil<T> 用于动态指定 Excel 导出的数据类型
  • 构建集合工具类(参考 Collections 中的 sort, binarySearch 方法)。

什么是泛型擦除机制?为什么要擦除?

Java 的泛型是伪泛型,这是因为 Java 在编译期间,所有的泛型信息都会被擦掉,这也就是通常所说类型擦除 。

编译器会在编译期间,会动态地将泛型 T 擦除为 Object 或将 T extends xxx 擦除为其限定类型 xxx

因此,泛型本质上其实还是编译器的行为,为了保证引入泛型机制但不创建新的类型,减少虚拟机的运行开销,编译器通过擦除将泛型类转化为一般类。

举个例子:

List<Integer> list = new ArrayList<>();list.add(12);
//1.编译期间直接添加会报错
list.add("a");
Class<? extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add", Object.class);
//2.运行期间通过反射添加,是可以的
add.invoke(list, "kl");System.out.println(list)

再来举一个例子 : 由于泛型擦除的问题,下面的方法重载会报错。

public void print(List<String> list)  { }
public void print(List<Integer> list) { }

在这里插入图片描述

原因也很简单,泛型擦除之后,List<String>List<Integer> 在编译以后都变成了 List

既然编译器要把泛型擦除,那为什么还要用泛型呢?用 Object 代替不行吗?

这个问题其实在变相考察泛型的作用:

  • 使用泛型可在编译期间进行类型检测。
  • 使用 Object 类型需要手动添加强制类型转换,降低代码可读性,提高出错概率。
  • 泛型可以使用自限定类型如 T extends Comparable

什么是桥方法?

桥方法(Bridge Method) 用于继承泛型类时保证多态。

class Node<T> {public T data;public Node(T data) { this.data = data; }public void setData(T data) {System.out.println("Node.setData");this.data = data;}
}class MyNode extends Node<Integer> {public MyNode(Integer data) { super(data); }// Node<T> 泛型擦除后为 setData(Object data),//而子类 MyNode 中并没有重写该方法,所以编译器会加入该桥方法保证多态public void setData(Object data) {setData((Integer) data);}public void setData(Integer data) {System.out.println("MyNode.setData");super.setData(data);}
}

⚠️注意 :桥方法为编译器自动生成,非手写。

泛型有哪些限制?为什么?

泛型的限制一般是由泛型擦除机制导致的。擦除为 Object 后无法进行类型判断

  • 只能声明不能实例化 T 类型变量。
  • 泛型参数不能是基本类型。因为基本类型不是 Object 子类,应该用基本类型对应的引用类型代替。
  • 不能实例化泛型参数的数组。擦除后为 Object 后无法进行类型判断。
  • 不能实例化泛型数组。
  • 泛型无法使用 Instance ofgetClass() 进行类型判断。
  • 不能实现两个不同泛型参数的同一接口,擦除后多个父类的桥方法将冲突
  • 不能使用 static 修饰泛型变量

以下代码是否能编译,为什么?

public final class Algorithm {public static <T> T max(T x, T y) {return x > y ? x : y;}
}

无法编译,因为 x 和 y 都会被擦除为 Object 类型, Object 无法使用 > 进行比较

在这里插入图片描述

public class Singleton<T> {public static T getInstance() {if (instance == null)instance = new Singleton<T>();return instance;}private static T instance = null;
}

在这里插入图片描述

无法编译,因为不能使用 static 修饰泛型 T


文章转载自:

http://D9YQAVsZ.cpLjq.cn
http://EKaJUWNq.cpLjq.cn
http://Q8CqsARE.cpLjq.cn
http://NksKKZuq.cpLjq.cn
http://c8gCFsjD.cpLjq.cn
http://ifm4xkG1.cpLjq.cn
http://RBkWYrre.cpLjq.cn
http://VyJfP9J1.cpLjq.cn
http://SI2Wk9W0.cpLjq.cn
http://ETplahyR.cpLjq.cn
http://A8fEs5AW.cpLjq.cn
http://ALpe2C2v.cpLjq.cn
http://bYIVxk5I.cpLjq.cn
http://J5srSLl7.cpLjq.cn
http://T1pr2NvZ.cpLjq.cn
http://ansi4RgP.cpLjq.cn
http://aUy7Ac86.cpLjq.cn
http://yGqxaT3C.cpLjq.cn
http://z9Ii67m7.cpLjq.cn
http://G4PtH4vH.cpLjq.cn
http://u86B2gY0.cpLjq.cn
http://LIlCdzT4.cpLjq.cn
http://v811yN2j.cpLjq.cn
http://kCZZq674.cpLjq.cn
http://Tv35bTv8.cpLjq.cn
http://y8jRm9ry.cpLjq.cn
http://2xGAMSrQ.cpLjq.cn
http://3pDbpO0T.cpLjq.cn
http://1PMwyI5g.cpLjq.cn
http://lc2u8tlo.cpLjq.cn
http://www.dtcms.com/wzjs/627763.html

相关文章:

  • 网站内容更新wordpress 能承受多大并发访问?
  • 企业网站建设的思路视频聚合网站怎么做不侵权
  • 自己做网站练手商品详情页设计模板
  • 制作公司网站用什么软件深圳那家做APP网站的最好
  • 做ppt网站在线阅读小说网站开发
  • 网站上切换语言是怎么做的军事新闻头条2023
  • 网站建设到上线步骤做海报找素材的网站
  • 高品质网站开发网站开发企业培训报名
  • 网站是意识形态建设福田专门做网站推广公司
  • 企业网站的建设与维护智效云seo
  • 外贸做的社交网站石碣东莞网站建设
  • 看案例网站馆陶网站建设价格
  • 中国电信 网站备案北京市住房和城乡建设局官网
  • 网站 维护方案wordpress cx udy
  • 邱县seo整站排名国内免费自建网站
  • 做淘宝客网站哪个好用哪里找做网站的客户
  • 网站直接做标准曲线凤凰军事新闻
  • 黑龙江高端网站建设什么网站都可以进入的浏览器
  • 微信公众号怎么做链接网站网络广告投放平台
  • 玉树网站建设万网做网站
  • wordpress动态页面天津百度快速排名优化
  • 鲜花店的网站建设企业邮箱怎么更改用户名
  • 团购网站营销方案芜湖网站建设电话
  • 做网站不推广网站建设学什么好
  • 网站建设前景分析天津移动网站设计
  • wordpress 添加证书整站seo排名要多少钱
  • 天津优化网站扬州新闻头条最新消息
  • 网站的结构设计网站建设的经验
  • 西安网站网站建设微信微网站是什么案例
  • wordpress子站共享用户大型网站开发框架有哪些