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

邵武网站建设WordPress免费问答主题

邵武网站建设,WordPress免费问答主题,wordpress jquery插件开发,学做电商那个网站好目录 前言 泛型带来的好处 泛型中通配符 小结 前言 Java 泛型#xff08;generics#xff09;是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制#xff0c;该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型#xff0c;也就是说所操…目录 前言 泛型带来的好处 泛型中通配符 小结 前言 Java 泛型generics是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型也就是说所操作的数据类型被指定为一个参数。 泛型带来的好处 在没有泛型的情况的下通过对类型 Object 的引用来实现参数的“任意化”“任意化”带来的缺点是要做显式的强制类型转换而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况编译器可能不提示错误在运行的时候才出现异常这是本身就是一个安全隐患。 那么泛型的好处就是在编译的时候能够检查类型安全并且所有的强制转换都是自动和隐式的。 public class GlmapperGenericT {private T t;public void set(T t) { this.t t; }public T get() { return t; }public static void main(String[] args) {// do nothing}/*** 不指定类型*/public void noSpecifyType(){GlmapperGeneric glmapperGeneric new GlmapperGeneric();glmapperGeneric.set(test);// 需要强制类型转换String test (String) glmapperGeneric.get();System.out.println(test);}/*** 指定类型*/public void specifyType(){GlmapperGenericString glmapperGeneric new GlmapperGeneric();glmapperGeneric.set(test);// 不需要强制类型转换String test glmapperGeneric.get();System.out.println(test);} } 上面这段代码中的 specifyType 方法中 省去了强制转换可以在编译时候检查类型安全可以用在类方法接口上。 泛型中通配符 我们在定义泛型类泛型方法泛型接口的时候经常会碰见很多不同的通配符比如 TEKV 等等这些通配符又都是什么意思呢 常用的 TEKV 本质上这些个都是通配符没啥区别只不过是编码时的一种约定俗成的东西。比如上述代码中的 T 我们可以换成 A-Z 之间的任何一个 字母都可以并不会影响程序的正常运行但是如果换成其他的字母代替 T 在可读性上可能会弱一些。通常情况下TEKV是这样约定的 表示不确定的 java 类型 T (type) 表示具体的一个java类型 K V (key value) 分别代表java键值中的Key Value E (element) 代表Elemen 无界通配符 先从一个小例子看起我有一个父类Animal和几个子类如狗、猫等现在我需要一个动物的列表我的第一个想法是像这样的 ListAnimal listAnimals 但是老板的想法确实这样的 List? extends Animal listAnimals 为什么要使用通配符而不是简单的泛型呢通配符其实在声明局部变量时是没有什么意义的但是当你为一个方法声明一个参数时它是非常重要的。 static int countLegs (List? extends Animal animals ) {int retVal 0;for ( Animal animal : animals ){retVal animal.countLegs();}return retVal; }static int countLegs1 (List Animal animals ){int retVal 0;for ( Animal animal : animals ){retVal animal.countLegs();}return retVal; }public static void main(String[] args) {ListDog dogs new ArrayList();// 不会报错countLegs( dogs );// 报错countLegs1(dogs); } 当调用 countLegs1 时就会飘红提示的错误信息如下 所以对于不确定或者不关心实际要操作的类型可以使用无限制通配符尖括号里一个问号即 ? 表示可以持有任何类型。像 countLegs 方法中限定了上界但是不关心具体类型是什么所以对于传入的 Animal 的所有子类都可以支持并且不会报错。而 countLegs1 就不行。 上界通配符 ? extends E 上界用 extends 关键字声明表示参数化的类型可能是所指定的类型或者是此类型的子类。 在类型参数中使用 extends 表示这个泛型中的参数必须是 E 或者 E 的子类这样有两个好处 1如果传入的类型不是 E 或者 E 的子类编译不成功 2泛型中可以使用 E 的方法要不然还得强转成 E 才能使用 private K extends A, E extends B E test(K arg1, E arg2){E result arg2;arg2.compareTo(arg1);//.....return result; } 类型参数列表中如果有多个类型参数上限用逗号分开 下界通配符 ? super E 下界: 用 super 进行声明表示参数化的类型可能是所指定的类型或者是此类型的父类型直至 Object 在类型参数中使用 super 表示这个泛型中的参数必须是 E 或者 E 的父类。 private T void test(List? super T dst, ListT src){for (T t : src) {dst.add(t);} }public static void main(String[] args) {ListDog dogs new ArrayList();ListAnimal animals new ArrayList();new Test3().test(animals,dogs); } // Dog 是 Animal 的子类 class Dog extends Animal {} dst 类型 “大于等于” src 的类型这里的“大于等于”是指 dst 表示的范围比 src 要大因此装得下 dst 的容器也就能装 src 。 和 T 的区别 和 T 都表示不确定的类型区别在于我们可以对 T 进行操作但是对 不行比如如下这种 // 可以 T t operate();// 不可以 car operate(); 简单总结下 T 是一个 确定的 类型通常用于泛型类和泛型方法的定义是一个 不确定 的类型通常用于泛型方法的调用代码和形参不能用于定义类和泛型方法。 区别1通过 T 来 确保 泛型参数的一致性 // 通过 T 来 确保 泛型参数的一致性 public T extends Number void test(ListT dest, ListT src)//通配符是 不确定的所以这个方法不能保证两个 List 具有相同的元素类型 public void test(List? extends Number dest, List? extends Number src) 像下面的代码中约定的 T 是 Number 的子类才可以但是申明时是用的 String 所以就会飘红报错。 不能保证两个 List 具有相同的元素类型的情况 GlmapperGenericString glmapperGeneric new GlmapperGeneric(); ListString dest new ArrayList(); ListNumber src new ArrayList(); glmapperGeneric.testNon(dest,src); 上面的代码在编译器并不会报错但是当进入到 testNon 方法内部操作时比如赋值对于 dest 和 src 而言就还是需要进行类型转换。 区别2类型参数可以多重限定而通配符不行 使用 符号设定多重边界Multi Bounds)指定泛型类型 T 必须是 MultiLimitInterfaceA 和 MultiLimitInterfaceB 的共有子类型此时变量 t 就具有了所有限定的方法和属性。对于通配符来说因为它不是一个确定的类型所以不能进行多重限定。 区别3通配符可以使用超类限定而类型参数不行 类型参数 T 只具有 一种 类型限定方式 T extends A 但是通配符 ? 可以进行 两种限定 ? extends A ? super A ClassT 和 Class? 区别 前面介绍了 和 T 的区别那么对于ClassT 和 Class? 又有什么区别呢ClassT 和 Class? 最常见的是在反射场景下的使用这里以用一段发射的代码来说明下。 // 通过反射的方式生成 multiLimit // 对象这里比较明显的是我们需要使用强制类型转换 MultiLimit multiLimit (MultiLimit) Class.forName(com.glmapper.bridge.boot.generic.MultiLimit) 对于上述代码在运行期如果反射的类型不是 MultiLimit 类那么一定会报 java.lang.ClassCastException 错误。 对于这种情况则可以使用下面的代码来代替使得在在编译期就能直接检查到类型的问题 ClassT 在实例化的时候T 要替换成具体类。Class? 它是个通配泛型? 可以代表任何类型所以主要用于声明时的限制情况。比如我们可以这样做申明 // 可以 public Class? clazz; // 不可以因为 T 需要指定类型 public ClassT clazzT; 所以当不知道定声明什么类型的 Class 的时候可以定义一 个Class?。 那如果也想 public ClassT clazzT; 这样的话就必须让当前的类也指定 T 。 public class Test3T { public Class? clazz; // 不会报错 public ClassT clazzT; 小结 本文零碎整理了下 JAVA 泛型中的一些点不是很全仅供参考。如果文中有不当的地方欢迎指正。
http://www.hkea.cn/news/14432435/

相关文章:

  • 怎样python做网站dedecms购物网站
  • 福州建设公司网站湖南注册公司
  • 公司做网站需要准备什么材料佐力药业股票千股千评
  • 海南智能网站建设公司万能邮箱登录入口
  • 洛阳网站制作wordpress腾讯cos插件
  • 做网站收录昆山建设工程招聘信息网站
  • 欧式建筑网站网贷代理平台
  • 太原网站建设招聘做视频广告在哪个网站能够赚钱
  • 重庆交通建设集团网站为wordpress添加虚拟用户权限
  • 网站 空间 双线网页设计简约
  • 校园兼职网站开发用例图百度app下载安装
  • 凡科网站备案ps软件下载电脑版免费怎么下载
  • 网络企业网站建设方案网站被入侵后需做的检测 1
  • 长春做电商网站的公司网站共享备案可以申请支付接口
  • 东莞做网站的公司哪家最好成免费crm软件
  • 网站开发者morz深圳公司手机网站制作
  • 如何在网站上做标记圈信息文字网页游戏
  • 长沙做四维彩超玛丽亚m网站响应式网站 英语
  • 网站的站外推广手段连云港网站开发
  • 教程网站搭建信用中国 网站 支持建设
  • 南京鼓楼做网站深圳设计网站有哪些
  • 品古典家具网站模板设计做网站哪家公司好
  • 常州网站制作机构营销网红
  • 直播网站开发计划书来雁新城建设投资公司官方网站
  • 网站制作培训中心珠海公众号开发公司
  • 商城建设网站的原因广州品牌网站建设
  • 法律建设企业网站网站模板没有html文件下载
  • 南昌网站建设基本流程企业网站兰州建设费用
  • 那些网站是针对物流做的图书馆网站建设工作总结
  • h5营销型网站功能天津网站建设方案书