Java中的generics范型
简介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. 创建一个范型方法
- 根据传递给范型方法的参数类型,可以使用不同类型的参数来调用范型函数。编译器适当地处理每个方法调用。
- 两种创建方法
- 使用范式类的参数类型
- 使用自定义的范式类型: 将参数放在返回值前面。当静态方法不能访问类的范式 只能用这个方法
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
*/
范型的优点
- 代码重用
- 类型安全
- 不需要类型转换
下面实现类型安全: 以数组类型解释。
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范型相关推荐
- Java 数组转型和范型
今天写代码遇到一个奇怪的问题,代码结构如下: [java] view plaincopy print? ArrayList<String> list = new ArrayList< ...
- Java spark中的各种范型接口Function的区别(持续更新中)
表格来自[2] Class Function Type Function<T, R> T => R DoubleFunction<T> T => Double Pa ...
- Java中switch对整型/字符型/字符串型具体实现细节
转自:http://www.hollischuang.com/archives/61 Java7中switch中支持的数据类型有: byte short int char String类型 其实swi ...
- Java中如何引用文档对象模型_在JAVA中使用文档对象模型DOM经验小结
文档对象模型 (DOM) 是一个文档标准,对于完备的文档和复杂的应用程序,DOM 提供了大量灵活性.DOM标准是标准的.它很强壮且完整,并且有许多实现.这是许多大型安装的决定因素--特别是对产品应用程 ...
- js 如何代替java中的长整型_Javascript长整型
我在javascript中看到了一件最奇怪的事情. 服务器端(弹簧): @RequestMapping(value = "/foo", method = RequestMethod ...
- java中generics的作用,java中泛型(Generics)的一些理解
public class Point { // // public Point(T x) { // this.x = x; // } private T x; private ...
- java 中 statent,【行为型模式】状态模式(state)之23种java设计模式
State接口类 public interface State { void handle(); } BookedState类 /** * 已预订状态 * @author Administrator ...
- java中Long型和long型的比较大小
一. Long数据的大小的比较 对于Long类型的数据,这个数据是一个对象,所以对象不可以直接通过">","==","<"的比较 ...
- java中generics的作用_Java Generics – 这个语法是什么?
以下代码的这部分是什么< String,Void,Bitmap>意思?我甚至都不知道甚至调用了这种语法. private class DownloadImageTask extends A ...
最新文章
- 为什么要设置java环境变量_为什么要配置JDK环境变量?
- python实现mongodb的备份与导入
- Python应用实战系列(一)-正则表达式大全
- AJAX请求和跨域请求详解(原生JS、Jquery)
- 微信小程序 基础2【条件渲染、swiper组件、生命周期、发起请求API】
- linux pti性能影响,Linux修正内核:Intel打补丁性能狂降、AMD不受影响
- java学习笔记2021.1.10
- 15.5 匿名内部类
- 设备 esp32_ESP32-S2 SoC、模组、开发板全面上市
- 一图解惑SQL JOINS
- 软件测试学习之 ---------- MySQL的查询(重中之重)
- Create React App 2.0 正式发布:Babel 7、webpack 4 等
- 嵌入式linux使用opencv,OpenCV嵌入式移植后XML读取问题及解决
- 【语音分析】基于matlab GUI语音信号分析【含Matlab源码 1718期】
- matlab灰色关联分析,灰色关联度分析(为什么不显示图像)大佬们帮我看看
- 系统架构改进--多系统用户整合
- python接外包_程序员到底要不要接外包?
- “新产业50人论坛”之清华龙桂鲁教授:量子信息与创新发展
- Windows内存清理----其实是没必要的
- node批量修改文件扩展名