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

凡科网客服电话是多少/宁波企业seo外包

凡科网客服电话是多少,宁波企业seo外包,做新浪网网站所需的条件,广州网站设计培训hello &#xff01;大家好&#xff01; 今天的主题就是&#xff1a;泛型。在使用集合类时&#xff0c;大家就已经接触到泛型了&#xff0c;那就是每个集合类后面的尖括号<>&#xff0c;这样一对尖括号&#xff0c;在java中就称为泛型。那么泛型这一个点&#xff0c;我们…

hello !大家好!

今天的主题就是:泛型。在使用集合类时,大家就已经接触到泛型了,那就是每个集合类后面的尖括号<>,这样一对尖括号,在java中就称为泛型。那么泛型这一个点,我们又该知道多少呢?我们往下看!

文章目录

    • 一、泛型的使用
    • 二、泛型类的定义-类型边界
    • 三、类型擦除
    • 四、泛型类的使用-通配符
    • 五、泛型方法
    • 六、泛型的限制

一、泛型的使用

前面我们学集合的时候,简单的说过泛型的使用。如下:

ArrayList<Integer> list = new ArrayList<>();
Queue<Integer> queue = new LinkedList<>();

那么使用是这样的简单,该注意什么?

  • 尖括号里的类型,只能写引用类型
  • 基础数据类型的话,就需要写相应的包装类型
  • 泛型只是编译时期的一种机制,在运行时是没有泛型的概念的。

二、泛型类的定义-类型边界

泛型还有一个点就是:泛型的上界。(类型形参 extends 类型边界)有如下代码:

public class Algorithm<T extends Comparable<T>> {public T findMax(T[] array) {}
}

以上代码中,方法的作用就是传递一个数组进去,要求返回这个数组中的最大值。

这个时候问题就来了,泛型是T类型,当调用这个方法的时候,传递过去的参数类型不一定就是简单数据类型啊。那么这个时候该怎么进行判断大小呢???

此时这样的泛型写法的作用就是:T extends Comparable, 就叫做泛型的上界,当传递参数类型的时候,必须传递过去的参数类型必须是实现了Comparable接口的类型才可以。换句话说,传递过去的类型必须是可以进行比较的。

当我们自己定义的一个类Node,然后实现Comparable接口,就能调用如上的方法。

切记,这样写的泛型,传递过去的参数类型,必须是实现了Comparable接口的,当然也可以传递Comparable接口本身

三、类型擦除

类型擦除值得是:代码编译后,会将泛型T,全部擦除为Object类型。如下代码:

ArrayList<Integer> list = new ArrayList<>();

上面这一行代码,虽然此时写的是Integer类型的,但是在编译之后,JVM会自动地将Integer擦除为Object。即就是这样子的:ArrayList。

那么可能就会有同学疑惑了,反正都要被擦除为Object类型,那干嘛还需要泛型这个东西???

那是因为有了泛型,可以让代码在编译的时候,进行类型的检查,就像上面的代码,写的是Integer类型的,那么传递过去的参数类型就必须是Integer类型才能通过编译。做到了类型检查,且在使用get方法,获取某一个数值的时候,也会自动地将数据从Object转换为Integer类型的。

以上的全部,只是解释了只写T类型的擦除机制。那么使用泛型的上界的话,JVM就不会直接擦除为Object类型了,而是上界是什么类型,就擦除为什么类型即可。比如

public class Algorithm<T extends Comparable<T>> {}

如上的代码,上界是Comparable接口,那么这个代码形参部分,最多也只是这个接口了,也就是说,天花板就是这个接口。那么此时JVM在擦除的时候,直接擦除为Comparable接口类型即可。

总结:类型擦除,主要还是要看类型的边界。

四、泛型类的使用-通配符

在泛型中,称为通配符。有如下代码:

public class MyArrayList<E> {//自定义的一个类
}//main方法中的一个普通方法
public static void printAll(MyArrayList<?> list) {//打印传递过来的参数list
}

以上代码,可能大家看起来会怪怪的。简单分析一下:

MyArrayList类型,是程序员自定义的一个类,采用了泛型。

而printAll方法,需要打印MyArrayList的数据,但是MyArrayList是一个独立的java文件,而printAll方法是在main方法中。二者并没有任何联系。那么此时在调用printAll时,形参部分就没法进行定义了。

此时的话,就只能使用MyArrayList<?>类型作为形参部分,这样定义的话,此时传递什么类型的MyArrayList,printAll方法都能够进行接收。

有如下调用代码:

public static void main(String[] args) {MyArrayList<String> list1 = new MyArrayList<>();MyArrayList<Integer> list2 = new MyArrayList<>();MyArrayList<Double> list3 = new MyArrayList<>();printAll(list1); //String类型printAll(list2); //Integer类型printAll(list3); //Double类型
}

以上代码,在运行的时候就不会报错了。printAll方法,能够接收所有类型的MyArrayList类的实例对象。

通配符的上界:<? extends 上界>

public static void printAll(MyArrayList<? extends Number> list) {}

如上代码,是在原来代码的基础之上,添加了上界。原先的代码是可以接收任何类型的MyArrayList实例对象。这里加了上界后,表示此时这个方法只能接收这个上界类型,以及上界的所有子类类型

就拿上面这个代码来说,上界是Number类型,那么此时这个printAll方法能够接收的形参类型就只能是Number或者Number的子类类型

public static void main(String[] args) {MyArrayList<String> list1 = new MyArrayList<>();MyArrayList<Integer> list2 = new MyArrayList<>();MyArrayList<Double> list3 = new MyArrayList<>();//printAll(list1); //String类型,此时String类型就会报错,因为String不是Number的子类printAll(list2); //Integer类型printAll(list3); //Double类型
}

如上代码,String类型的MyArrayList,调用printAll方法,就会报错,因为String不是Number类的子类。

同理有了通配符的上界,那么也有通配符的下界。

通配符的下界:<? super 下界>

public static void printAll(MyArrayList<? super Integer> list) {}

同理,此时传递过去的MyArrayList实例对象的类型,只能是Integer类型,或者是Integer类型的父类

public static void main(String[] args) {MyArrayList<String> list1 = new MyArrayList<>();MyArrayList<Integer> list2 = new MyArrayList<>();MyArrayList<Double> list3 = new MyArrayList<>();MyArrayList<Number> list4 = new MyArrayList<>(); MyArrayList<Object> list5 = new MyArrayList<>();//printAll(list1); //此时String类型就会报错,因为String的父类并不是IntegerprintAll(list3); //Double类型//此时Double类型也会报错,Double类型的父类并不是IntegerprintAll(list2); //Integer类型printAll(list4); //Number类型printAll(list5); //Object类型,是所有类的父类
}

以上代码,就是通配符的下界。传递的参数类型,只能是该下界或者是下界的父类。

五、泛型方法

除了泛型类,还有一个泛型方法的概念。比较以下两个代码:

//泛型类的写法
public class Algorithm<T extends Comparable<T>> {public T findMax(T[] array) {}
}

此时我想把findMax方法,写成静态的。写成静态之后,这个方法就不依赖于对象了,只需要通过类名就能进行调用,可能你会觉得这还不简单,你就写下了以下代码:

//猜想你会写如下代码--错误写法
public class Algorithm<T extends Comparable<T>> {public static T findMax(T[] array) {}
} 

上面写的代码,肯定是不对的。正确的写法如下:

//静态方法的正确写法
public class Algorithm {public static<T extends Comparable<T>> T findMax(T[] array) {}
}

如上代码,既然是写泛型方法,我们只需将原先写在类名后面的泛型,写在static关键字后面即可。这样写就是一个泛型方法。

六、泛型的限制

  • 泛型类型不支持基本数据类型,只能传递基本数据类型的包装类
  • 无法实例化泛型类型的对象。(比如new T)
  • 无法使用泛型类型声明静态的属性
  • 无法使用instanceof判断带类型参数的泛型类型
  • 无法创建泛型类的数组。(只能new Object[],然后强转)
  • 无法create、catch、throw一个泛型类异常(异常不支持泛型)
  • 泛型类型不是形参的一部分,无法重载

好啦,本期更新就到此结束啦,我们下期见吧!!!

http://www.jmfq.cn/news/5131549.html

相关文章:

  • 深圳网站建设信科公司便宜/哪个app可以找培训班
  • 做网站开店/淘宝关键词优化工具
  • 网站 廉政建设 板块/中国十大搜索引擎网站
  • dreamweaver设计网页步骤/seo的概念
  • 品牌的手机网站制作/电脑培训学校在哪里
  • 网站平台策划方案/疫情放开死亡人数最新消息
  • 电子商务网站建设步骤有什么/方象科技专注于什么领域
  • 怎么做别人可以上的网站/实训百度搜索引擎的总结
  • 信誉好的邢台做网站/人员优化是什么意思
  • 商城网站数据库表关系设计/网页制作接单
  • 网站建设最新签约/星巴克seo网络推广
  • 句容网站建设制作/太原网站制作优化seo公司
  • 网站怎么做响应/谷歌浏览器下载手机版
  • 做亚马逊网站一般发什么快递公司/软件制作
  • 成都优化网站关键词/做seo推广一年大概的费用
  • 游戏网站开发公司/电子邮件营销
  • 创意字体设计网站/优化网站链接的方法
  • 什么网站是做汽车装饰配件的/seo页面代码优化
  • 查国外企业用什么软件/域名查询seo
  • wordpress隐藏后台登录/百度关键词优化的意思
  • 昆明做网站建设公司/创意设计
  • 网站banner特效/微信营销软件免费版
  • 东兴移动网站建设/ue5培训机构哪家强
  • 手机网站打不开的解决方法/市场营销的对象有哪些
  • 衡阳商城网站制作/提高工作效率的方法不正确的是
  • 舟山做网站的公司/深圳开发公司网站建设
  • 东营招标投标信息网/白云百度seo公司
  • 武汉做网站多少钱/网络营销推广方案策划
  • java php 做网站/企业网络营销系统分析报告
  • 装修设计平台有哪些/seo优化软件