简介generics范型

  • Generics 范型
    • 构造范型
    • 范型的优点
    • Wildcards 使用通配符

Generics 范型

  • 范型意味着参数化类型。所操作的数据类型都被指定为一个参数
  • 范型可以为接口、类、方法提供参数(Integer, String, Double,用户自定义的类型等)
  • 可以提供编译时类型安全。
  • 使用范型可以创建不同参数类型的类

构造范型

1.创建一个范型类

  • 为了解决可以添加任意对象而创造。ArrayList 是Java自带的泛型类

  • 参数使用<>括起来

  • 多个参数使用 , 分隔开

  • 后期实例化类时 传入的参数要对应。否则会报错

public class demo<T, U> { //T和U是任何一种类型 anything。根据后期实例化这个类时定义的参数类型private T t;private U u;public void setValue(T t, U u) {this.t=t;this.u=u;}public T getValue1() { //Generic 方法return t;}public U getValue2() {return u;}public static void main(String[] args) {demo<Integer, String> iobj1=new demo<Integer, String>();iobj1.setValue(10, "chang");System.out.println(iobj1.getValue1()+" "+iobj1.getValue2());demo<Character, Boolean> iobj2=new demo<Character, Boolean>();iobj2.setValue('c', true);System.out.println(iobj2.getValue1()+" "+iobj2.getValue2());
/*
output:
10 chang
c true
*/

2. 创建一个范型方法

  • 根据传递给范型方法的参数类型,可以使用不同类型的参数来调用范型函数。编译器适当地处理每个方法调用。
  • 两种创建方法
      1. 使用范式类的参数类型
      2. 使用自定义的范式类型: 将参数放在返回值前面。当静态方法不能访问类的范式 只能用这个方法
public class GenericMethod{public <T>T dispaly(T val) { //可以接受任何类型 这是方法2return val;}public <T>void show(T val1, T val2) {System.out.println("Age:"+val1+"\nname:"+val2);}public static void main(String[] args) {GenericMethod obj=new GenericMethod();System.out.println("String "+obj.dispaly("chang"));System.out.println("Int "+obj.dispaly(10));System.out.println("Boolean "+obj.dispaly(true));System.out.println("Double "+obj.dispaly(22.22));}}
/*
output:
String chang
Int 10
Boolean true
Double 22.22
Age:19
*/

范型的优点

  1. 代码重用
  2. 类型安全
  3. 不需要类型转换

下面实现类型安全: 以数组类型解释。

public class TypeSafety { //可以将运行时错误 转化为编译错误。同时也可以避免使用castpublic static void main(String[] args) {ArrayList<String>  arr=new ArrayList<String>();arr.add("chang");arr.add("jia");//arr.add(10); 此话会报错 如果没有范式 增加10就不会报错String s1=arr.get(0);String s2=arr.get(1);ArrayList arr1=new ArrayList();arr1.add(10);arr1.add("chang");System.out.println(arr1);Object exam=arr1.get(0);System.out.println(exam);System.out.println(arr1.get(1));}}
/*
output:
[10, chang]
10
chang
*/

Wildcards 使用通配符

  • 范型类包含:class和范型值 两部分。

  • 当我们不确定传入对象的类型时 可以使用通配符

  • 只有当着两部分完全匹配时 才可以代表同一类型

          Classdemo<Number> obj1=new classdemo<number>(); //可以执行Classdemo<Integer> obj1=new classdemo<Integer>(); //可以执行Classdemo<Number> obj1=new classdemo<Integer>();  //不可以执行
    

有以下三种通配符

? extends XXX: 可以匹配到任何XXX的子类。 相当于XXX是上限。

? super XXX: 可以匹配到任何XXX的超类。 相当于XXX是下限。

? XXX: 没有任何限制

分享一篇好博客 详解了三种通配符
但是我没看懂

public class WildCard<T> {private T t;public void setValue(T t) {this.t=t;}//这个方法用来和这个类的另一个对象进行比较。 参数必须是Number的子类public boolean com(WildCard<? extends Number> obj) { //和另一个类的对象比较if(t==obj.t) return true;else return false;}public static void main(String[] args) {WildCard<Integer> obj=new WildCard<Integer>();obj.setValue(10);WildCard<String> obj1=new WildCard<String>();obj1.setValue("chang");//System.out.println(obj.com(obj1)); 类型不匹配会报错WildCard<Double> obj2=new WildCard<Double>();obj2.setValue(10.0);System.out.println(obj.com(obj2)); //类型匹配不会报错}
}

Java中的generics范型相关推荐

  1. Java 数组转型和范型

    今天写代码遇到一个奇怪的问题,代码结构如下: [java] view plaincopy print? ArrayList<String> list = new ArrayList< ...

  2. Java spark中的各种范型接口Function的区别(持续更新中)

    表格来自[2] Class Function Type Function<T, R> T => R DoubleFunction<T> T => Double Pa ...

  3. Java中switch对整型/字符型/字符串型具体实现细节

    转自:http://www.hollischuang.com/archives/61 Java7中switch中支持的数据类型有: byte short int char String类型 其实swi ...

  4. Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结

    文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂的应用程序,DOM 提供了大量灵活性.DOM标准是标准的.它很强壮且完整,并且有许多实现.这是许多大型安装的决定因素--特别是对产品应用程 ...

  5. js 如何代替java中的长整型_Javascript长整型

    我在javascript中看到了一件最奇怪的事情. 服务器端(弹簧): @RequestMapping(value = "/foo", method = RequestMethod ...

  6. java中generics的作用,java中泛型(Generics)的一些理解

    public class Point { // //    public Point(T x) { //        this.x = x; //    } private T x; private ...

  7. java 中 statent,【行为型模式】状态模式(state)之23种java设计模式

    State接口类 public interface State { void handle(); } BookedState类 /** * 已预订状态 * @author Administrator ...

  8. java中Long型和long型的比较大小

    一. Long数据的大小的比较 对于Long类型的数据,这个数据是一个对象,所以对象不可以直接通过">","==","<"的比较 ...

  9. java中generics的作用_Java Generics – 这个语法是什么?

    以下代码的这部分是什么< String,Void,Bitmap>意思?我甚至都不知道甚至调用了这种语法. private class DownloadImageTask extends A ...

最新文章

  1. 为什么要设置java环境变量_为什么要配置JDK环境变量?
  2. python实现mongodb的备份与导入
  3. Python应用实战系列(一)-正则表达式大全
  4. AJAX请求和跨域请求详解(原生JS、Jquery)
  5. 微信小程序 基础2【条件渲染、swiper组件、生命周期、发起请求API】
  6. linux pti性能影响,Linux修正内核:Intel打补丁性能狂降、AMD不受影响
  7. java学习笔记2021.1.10
  8. 15.5 匿名内部类
  9. 设备 esp32_ESP32-S2 SoC、模组、开发板全面上市
  10. 一图解惑SQL JOINS
  11. 软件测试学习之 ---------- MySQL的查询(重中之重)
  12. Create React App 2.0 正式发布:Babel 7、webpack 4 等
  13. 嵌入式linux使用opencv,OpenCV嵌入式移植后XML读取问题及解决
  14. 【语音分析】基于matlab GUI语音信号分析【含Matlab源码 1718期】
  15. matlab灰色关联分析,灰色关联度分析(为什么不显示图像)大佬们帮我看看
  16. 系统架构改进--多系统用户整合
  17. python接外包_程序员到底要不要接外包?
  18. “新产业50人论坛”之清华龙桂鲁教授:量子信息与创新发展
  19. Windows内存清理----其实是没必要的
  20. node批量修改文件扩展名

热门文章

  1. Git关联远程GitHub仓库
  2. CentOS(Linux)下安装redis (端口号:6379)
  3. java 将微信录音amr转换为mp3格式
  4. 应用libmad制作一款mp3播放器
  5. Android王者荣耀模拟金牌,王者荣耀:金牌算法大改,掌握这几点,让你金牌拿到手软...
  6. Visor Finance 攻击分析
  7. (十 二)特殊的二阶张量——正交张量(二)
  8. CSS入门篇10.浮动的简介与三个特点
  9. vue+elementUI实现sku表格自动生成【效果图+源码】
  10. 使用双摄手机获取深度图像