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

开关网站建设营销的方法手段有哪些

开关网站建设,营销的方法手段有哪些,开源门户网站建设方案,云南建个网站哪家便宜前言Java 1.5之前是没有泛型的,以前从集合中读取每个对象都必须先进行转换,如果不小心存入集合中对象类型是错的,运行过程中转换处理会报错。有了泛型之后编译器会自动帮助转换,使程序更加安全,但是要正确使用泛型才能…

前言

Java 1.5之前是没有泛型的,以前从集合中读取每个对象都必须先进行转换,如果不小心存入集合中对象类型是错的,运行过程中转换处理会报错。有了泛型之后编译器会自动帮助转换,使程序更加安全,但是要正确使用泛型才能取得事半功倍的效果。

本文主要从不要使用原生类型,泛型方法,限制通配符,类型安全的异构容器四个部分来说明如何正确使用Java泛型。

一、不要使用原生态类型

1. 什么是原生态类型?

原生态类型(Raw type),即不带任何实际类型参数的泛型名称。如与List对应的原生态类型List。不推荐List list = new ArrayList()这样的方式,主要就会丢掉安全性(为什么不安全呢?具体请往下看),应使用List list = new ArrayList()明确类型。或者使用List(那么List与List有啥区别呢?具体可以看泛型的子类型规则部分)

2. 为什么不推荐使用原生态类型?

当我们使用原生态类型List创建一个集合,并往其中放入Stamp类与Coin类,并迭代循环获取List集合中的元素。

public class RawType_Class { public static void main(String[] args) { List list = new ArrayList<>(); list.add(new Stamp()); list.add(new Coin()); for (Iterator i = list.iterator(); i.hasNext();) { Stamp stamp = i.next(); } }}

此时必须使用Cast强转,否则编译会报错,在编译期报错对于开发者来说是我们最希望看到的。

ac35756bae7d78ebf38f48d4a6238127.png

但是我们根据提示,增加Cast,好了编译是不会报错了,但是运行时期会报错! Exception in thread "main" java.lang.ClassCastException: ,这就对我们开发者来说大大增加了难度。

public class RawType_Class { public static void main(String[] args) { List list = new ArrayList<>(); list.add(new Stamp()); list.add(new Coin()); for (Iterator i = list.iterator(); i.hasNext();) { Stamp stamp = (Stamp) i.next(); } }}

由此可见,原生类型是不推荐使用,是不安全的!

问1:那为什么Java还要允许使用原生态类型呢?

是为了提升兼容性,Java1.5之前已经存在很多的原生态类型的代码,那么为了让代码保持合法,并且能够兼容新代码,因此Java才对原生态类型支持!

问2:那我们使用List是不是就可以了呢,两个有啥区别呢?

两者都可以插入任意类型的对象。不严格来说,前者原生态类型List逃避了泛型检查,后者参数化类型List明确告诉编译器能够持有任意类型的对象。但是两个的区别主要是泛型存在子类型规则,具体请往下看

3. 泛型的子类型规则

子类型规则,即任何参数化的类型是原生态类型的一个子类型,比如List是原生态类型List的一个子类型,而不是参数化List的子类型。

由于子类型规则的存在,我们可以将List传递给List类型的参数

public static void main(String[] args) {  List strings = new ArrayList<>(); unsafeAdd(strings, new Integer(1)); String s = strings.get(0);}private static void unsafeAdd(List list, Object o){  list.add(o);}

虽然编译器是没有报错的,但是编译过程会出现以下提示,表明编写了某种不安全的未受检的操作

b78e72953a8574d3c2f69f9d848a1441.png

但是我们不能将List传递给List类型参数

public static void main(String[] args) {  List strings = new ArrayList<>(); unsafeAdd(strings, new Integer(1)); String s = strings.get(0);}private static void unsafeAdd(List list, Object o){  list.add(o);}

编译后就直接报错,事实上编译器就会自动提示有错误

01af298a682a703c387c481bb56dcce1.png

4. 无限制的通配符类型

使用原生态类型是很危险的,但是如果不确定或不关心实际的类型参数,那么在Java 1.5之后Java有一种安全的替换方法,称之为无限制的通配符类型(unbounded wildcard type),可以用一个“?”代替,比如Set>表示某个类型的集合,可以持有任何集合。

那么无限制通配类型与原生态类型有啥区别呢?原生态类型是可以插入任何类型的元素,但是无限制通配类型的话,不能添加任何元素(null除外)。

0fc08d413b7f6510a07b7dce1ff6e7e2.png

问:那么这样的通配符类型有意义吗?因为你并不知道它到底能加入啥样的元素,但是又美其名曰“无限制”。

不能说没有意义,因为它的出现归根结底是为了防止破坏集合类型约束条件,并且可以根据需要使用泛型方法或者有限制的通配符类型(bound wildcard type)接口某些限制,提高安全性。

5. 泛型的可擦除性

我们先看一下代码,看看结果:

public static void main(String[] args) { List l1 = new ArrayList(); List l2 = new ArrayList(); // 输出为true,擦除后的类型为List System.out.println(l1.getClass() == l2.getClass());}

结果为true,这是因为:泛型信息可以在运行时被擦除,泛型在编译期有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉。归根结底不管泛型被参数具体化成什么类型,其class都是RawType.class,比如List.class,而不是List.class或List.class

事实上,在类文字中必须使用原生态类型,不准使用参数化类型(虽然允许使用数组类型和基本类型),也就是List.class、String[].class和int.class都是合法的,而List.class和List>.class不合法

二、泛型方法

1、基本概念

之前说过,如果直接使用原生态类型编译过程会有警告,运行过程可能会报异常,是非常不安全的一种方式。

private static Set union(Set s1, Set s2){ Set result = new HashSet(); result.add(s2); return result; }

如果是在方法中使用,为了修正这些警告,使方法变成类型安全的,可以为方法声明一个类型参数。

 private static  Set union(Set s1, Set s2){ Set result = new HashSet(); result.add(s2); return result; }

static后面的就是方法的类型参数,这样的话三个集合的类型(两个输入参数与一个返回值)必须全部相同。这样的泛型方法不需要明确指定类型参数的值,而是通过判断参数的类型计算类型参数的值,对于参数Set而言,编译器自然知道返回的类型参数E也是String,这就是所谓的类型推导(type inference)

a71a27027088169043afd75c9926b1bb.png

2、泛型单例工厂

有时候我们需要创建不可变但又适合许多不同类型的对象。之前的单例模式满足不可变,但不适合不同类型对象,这次我们可以利用泛型做到这点。

/** * apply方法接收与返回某个类型T的值 * @param  */public interface UnaryFunction { T apply(T arg);}

现在我们需要一个恒等函数(Identity function,f(x)=x,简单理解输入等于返回的函数,会返回未被修改的参数),如果每次需要的时候都要重新创建一个,这样就会很浪费,如果泛型被具体化了,每个类型都需要一个恒等函数,但是它们被擦除后,就只需要一个泛型单例。

   /** * 返回未被修改的参数arg */ private static UnaryFunction IDENTITY_FUNCTION = (Object arg) -> { return arg; }; /** * 泛型方法identityFunction: * 返回类型:UnaryFunction * 类型参数列表; * 忽略强制转换未受检查的警告: * 因为返回未被修改的参数arg,所以我们知道无论T的值是什么,都是类型安全的 * @param  * @return */ @SuppressWarnings("unchacked") public static  UnaryFunction identityFunction(){ return (UnaryFunction) IDENTITY_FUNCTION; }

利用泛型单例编写测试,下面代码不会报任何的警告或错误。

public static void main(String[] args) { String[] strings = {"hello
http://www.lbrq.cn/news/2658997.html

相关文章:

  • 网站类型定位宁波seo外包服务平台
  • 网站关键词搜索排名怎么做搜索引擎优化的内容包括
  • 网站建设制作、微信公众号百度贴吧广告投放价格
  • 个人网站备案成功后怎么做广州seo关键词
  • dz后台网站地图湖人最新排名最新排名
  • 如何做网站管理维护百度大数据预测平台
  • 怎么做简单的网站首页免费的h5制作网站
  • 用领导人在公司网站做宣传犯法吗注册城乡规划师
  • 重庆做网站的公司有哪些凤山网站seo
  • 岳阳网站制作网站推广的优化
  • 做电影网站程序哪个好哈尔滨电话本黄页
  • WordPress代码mac显示seo快速排名站外流量推广
  • 铜陵网站建设公司seo关键词排名优化app
  • 百度推广开户2400seo推广优化方案
  • 网站建设多久高端大气网站建设
  • 微商城网站开发百度品牌推广
  • xx汽车企业网站和信息化建设万江专业网站快速排名
  • 软件开发专业的大学谷歌seo顾问
  • 建站平台的基础概念信息流广告代理商排名
  • 固原住房和城乡建设厅网站seo是什么东西
  • 哪个网站做螺丝生意好招商外包
  • 做兼职写小说网站新闻营销发稿平台
  • 苏州网站建设狮山路网络营销案例具体分析
  • 济南网站制作哪家专业淘宝关键词优化
  • 网站建设只有20%的利润百度指数有三个功能模块
  • 网站源码换模板百度视频推广怎么收费
  • 洛阳网站建设设计公司哪家好网站内容管理系统
  • 虚拟机怎么做网站空间怎么样做免费的百度seo
  • 网站托管服务使用于那种类型的网站网络营销总监岗位职责
  • 怎样自学做网站全网营销有哪些平台
  • C语言:指针(2)
  • 智能体革命:网络安全人的角色重塑与突围指南
  • C/C++内存管理函数模板
  • DBAPI 实现不同角色控制查看表的不同列
  • 计算机视觉全景指南:从OpenCV预处理到YOLOv8实战,解锁多模态AI时代(第五章)
  • Baumer高防护相机如何通过YoloV8深度学习模型实现输电线路塔电缆检测分割(C#代码UI界面版)