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

均安网站制作seo范畴

均安网站制作,seo范畴,网页兼容性 网站开发,万网虚拟空间 asp.net多网站部署注:以下内容基于Java 8,所有代码都已在Java 8环境下测试通过 目录: Java泛型1——概述Java泛型2——泛型类Java泛型3——泛型接口Java泛型4——泛型方法Java泛型5——泛型通配符Java泛型6——类型擦除 什么是通配符 在Java中,类…

注:以下内容基于Java 8,所有代码都已在Java 8环境下测试通过

目录:

  • Java泛型1——概述
  • Java泛型2——泛型类
  • Java泛型3——泛型接口
  • Java泛型4——泛型方法
  • Java泛型5——泛型通配符
  • Java泛型6——类型擦除

什么是通配符

在Java中,类与类之间是有继承关系的。例如,Integer 类继承自 Number 类,因此Integer 类的对象可以赋值给 Number 类的引用(即向上转型,这是可以实现多态性的一个重要因素)。但集合之间没有这种关系,也就是 LinkedList<Integer>LinkedList<Number>之间并没有继承关系,它们都是LinkedList。因此 LinkedList<Number> 的集合并不能存放Integer 类型的变量(虽然Integer 类继承自 Number 类)。

比如下面这段代码:

public class Main {private static void dealTest(Test<Father> test) {System.out.println(test.getClass());}public static void main(String[] args) {Test<Father> tesF = new Test<>();Test<Child> testC = new Test<>();Main.dealTest(tesF);Main.dealTest(testC);//编译器报错}
}class Father {}class Child extends Father {}class Test<T> {}

这段代码定义了一个泛型类 Test ,并定义了一个处理该类的静态方法 dealTest(),该类接受一个 Test<Father> 对象作为参数。根据上面的介绍可以知道,虽然ChildFather 的子类,但Test<Child>Test<Father> 之间并没有继承关系,因此静态方法 dealTest()不能接受一个 Test<Son> 对象。因此,若想让静态方法 dealTest()处理Test<Son> 对象,还需对其进行重载:

private static void dealTest(Test<Child> test) {}

但这显然违背了多态性的设计理念,而且这是编译器不允许的做法。如果能让 dealTest()方法不只接受Test<Father>对象,而是让其接受Test<XXX>对象,其中XXX代表某一类型内的类型参数,那么上面这个问题就可以解决了。

这就是泛型通配符的作用:泛型通配符用于限制类型参数的范围。

泛型通配符有 3 种形式:

  • <?> :无界通配符
  • <? extends T> :有上界的通配符
  • <? super T> :有下界的通配符

无界通配符

无界通配符:<?>,其中 ? 代表了任意一种数据类型。比如,下面这段代码:

public class Main {private static void dealTest(Test<?> test) {//?代表可以使用任意一种数据类型System.out.println(test.getClass());}public static void main(String[] args) {Test<Father> tesF = new Test<>();Test<Child> testC = new Test<>();Test<Integer> testI = new Test<>();Main.dealTest(tesF);Main.dealTest(testC);Main.dealTest(testI);}
}class Father {}class Child extends Father {}class Test<T> {}

由于使用了无界通配符,dealTest()方法可以接受具有不同泛型参数的泛型类 Test的对象。

需要注意:

  • 不要混淆 Test<Object>Test<?>Object 也是一种数据类型,因此 Test<Object> 代表参数类型只能为ObjectTestTest<?>代表参数类型可以是任意数据类型的Test

  • 最后不要在实例化泛型类的时候使用无界通配符<?> 集合的数据类型是不确定的,因此我们只能往集合中添加null,而且从其中取出的元素也只能赋值给Object对象。

    import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<?> list = new LinkedList<>();list.add(null);list.add(1);//编译器报错,只能放入null}
    }
    

上界通配符

上界通配符:<? extends T>,其中T 代表了类型参数的上界。上界通配符将类型参数限制为特定类型T及其子类型。比如,<? extends Number>表示类型参数可以是Number以及Number的子类。

可以使用上界通配符对上面的代码进行改写:

public class Main {private static void dealTest(Test<? extends Father> test) {//<? extends Father> 代表可以使用 Father 及其子类作为类型参数System.out.println(test.getClass());}public static void main(String[] args) {Test<Father> fatherTest = new Test<>();Test<Child> childTest = new Test<>();Main.dealTest(fatherTest);Main.dealTest(childTest);}
}class Father {}class Child extends Father {}class Test<T> {}

LinkedList<? extends Number> 为例,在使用上界通配符的时候需要注意:

LinkedList<? extends Number> 可以代表 LinkedList<? extends Interger>LinkedList<? extends Double>……但是,不能指定 LinkedList<? extends Number>的数据类型。如下:

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<? extends Number> list1 = new LinkedList<Integer>();//编译正确LinkedList<? extends Number> list2 = new LinkedList<Double>();//编译正确LinkedList<? extends Number> list3 = new LinkedList<Object>();//编译器报错,超出上界LinkedList<Number> list4 = new LinkedList<Integer>();//编译器报错list1.add(1);//编译器报错list1.add(2.3);//编译器报错list1.add(null);//编译正确}
}

在看上面的代码之前,需要明确一个概念,那就是 LinkedList<? extends Number>表示这个集合可能是 LinkedList<? extends Interger>也可能是 LinkedList<? extends Double>,但它什么都可能是的后果就是它什么也不是,也就是说不能确定它到底是 LinkedList<? extends Interger>还是 LinkedList<? extends Double>或者其他什么集合,所以也就不能往里面添加具体类型的元素,因为不能确定它是什么类型的。但和无界通配符类似,可以往里面添加null

下界通配符

下界通配符:<? super T>,与上界通配符刚好相反,T代表了类型参数的下界。类似地,下界通配符将类型参数限制为特定类型T及其超类。比如,<? extends Integer>表示类型参数可以是Integer以及Integer的超类。

可以使用下界通配符对上面的代码进行改写:

public class Main {private static void dealTest(Test<? super Child> test) {//<? super Child> 代表可以使用 Child 及其超类作为类型参数System.out.println(test.getClass());}public static void main(String[] args) {Test<Father> fatherTest = new Test<>();Test<Child> childTest = new Test<>();Main.dealTest(fatherTest);Main.dealTest(childTest);}
}class Father {}class Child extends Father {}class Test<T> {}

带有上界统配符的集合LinkedList<? extends Number>不能添加具体类型的元素,但是带有下界通配符的集合LinkedList<? super Number>可以添加Number类及其子类的对象,但是不能添加Number类的父类对象。因为LinkedList<? extends Number>最低也是个LinkedList<Number extends Number>集合,因此至少也能存放Number类对象,所以也可以存放Number子类对象。但是LinkedList<? extends Number>的上限不知道,所以类似于带有上界通配符的集合不能存放具体的数据类型,LinkedList<? extends Number>也不能存放Number父类的对象。

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<? super Number> list1 = new LinkedList<Object>();//编译正确LinkedList<? super Number> list2 = new LinkedList<Integer>();//编译器报错,超出下界list1.add(1);//编译正确list1.add((Object) 2.5);//编译器报错,不能存放 Number 类的父类对象}
}
http://www.wooajung.com/news/31279.html

相关文章:

  • 关于建设学校网站的报告网络营销工程师培训
  • 网站备案哪个部门排名网站
  • 上海网站seo设计外贸网站平台哪个好
  • 店铺管理appseo技术培训唐山
  • wordpress设置密码访问带提示seo最新技巧
  • 邯郸手机网站建设网页设计论文
  • 临海网站设计模板建站平台
  • 公司有必要建设网站吗三亚百度推广地址
  • 揭阳做网站的香港服务器
  • 最简单的网站制作公众号推广方案
  • 网站建设违约北京百度seo点击器
  • 哪里帮做企业网站在线子域名二级域名查询工具
  • 和城乡建设厅官方网站嘉兴seo外包平台
  • 河南 医院 网站建设手机怎么自己制作网页
  • 二手站网站怎做百度客服电话是多少
  • 资讯网站 怎样 增强用户粘度百度云网页版入口
  • html网站架设招聘网络营销推广人员
  • 单页面网站如何优化引流万能搜索引擎
  • 做字体的网站网络营销的特点不包括
  • 找图做素材啥网站好焊工培训ppt课件
  • 网站建设选方舟网络网络推广外包业务怎么样
  • 照明网站设计正版google下载
  • 重庆网站平台建设百度新版本更新下载
  • 郑州网页网站制作公司推广策划方案
  • 高端网站制作网站设计合肥今天的最新消息
  • 国内产品网站建设百度关键词搜索排名统计
  • 武汉宣传片制作公司广州网站营销seo费用
  • 做语文课文网站的好处网络优化需要哪些知识
  • 动态网站建设包括哪些最近新闻头条
  • 爱做网站应用商店搜索优化