泛型的来源

在Java中,泛型借鉴了C++的模版函数,从而引入了泛型。

  • C++泛型
int add(int x,int y){
return x + y;
} float add(float x.float y){
return x + y;
} double add(double x,double y){
return x + y;
} // 泛型函数对上面的整数,浮点数的抽象和实现
template<class T>
T add(T x,T y){
return x + y;
}
  • 自定义泛型
public class MyGeneric {

    public static void main(String[] args) {
// 泛型推断的一般原则,用于返回泛型参数中的交集,且泛型参数必须为引用类型
// 3 自动装箱 Integer 5 自动装箱Integer 所以 推断出Integer
Integer result1 = add(3, 5);
// 3.5 自动装箱 Double 5 自动装箱Integer 所以推断出共有的父类Number
Number result2 = add(3.5, 5);
// 3 自动装箱Integer str1 String 共有的交集,都是Object
Object result3 = add(3, "str1"); } /**
* 泛型方法的定义:
* 用于放置泛型的类型参数的尖括号应出现在方法的其他所有修饰符之后和在方法的返回类型之前,也就是紧邻返回值之前,下面的 <T>
* 按照惯例,类型参数通常用单个大写字母表示
* 只有引用类型才会被当作方形方法的参数,会自动装箱的也算
* @param x
* @param y
* @return
*/
public static <T> T add(T x,T y) {
// 这里编译器会报错:The operator + is undefined for the argument type(s) T, T
// 因为不是所有的泛型都支持 + 操作,但是由这个方法可以看到java的类型推断
// T result = x + y;
return null;
}
}

自定义泛型实战

  • 编写一个泛型方法,自动将Object类型的对象转换成其他类型。
/**
* 编写一个泛型方法,自动将Object类型的对象转换成其他类型。
* @param obj
* @return
*/
private static <T> T autoConvert(Object obj) {
return (T) obj;
}
// 测试代码
public static void main(String[] args) { Object object = "helloWorld";
String helloworld = autoConvert(object);
System.out.println("helloworld = " + helloworld); }
  • 定义一个方法,可以将任意类型的数组中的所有元素填充为相应类型的某个对象
/**
* 定义一个方法,可以将任意类型的数组中的所有元素填充为相应类型的某个对象
* @param t 数组
* @param obj 对象
*/
private static <T> void fillArray(T[] t,T obj) {
for (int i = 0; i < t.length; i++) {
t[i] = obj;
}
}
  • 采用自定义泛型方法的方式打印出任意参数化类型的集合中的所有内容
/**
* 采用自定义泛型方法的方式打印出任意参数化类型的集合中的所有内容
* @param t
*/
private static <T> void printArray(T[] t) {
for (int i = 0; i < t.length; i++) {
System.out.println("ele[" + i + "] = " + t[i]);
} }
/**
* 采用自定义泛型方法的方式打印出任意参数化类型的集合中的所有内容
* @param t
*/
private static <T> void printArray(Collection<T> t) {
int i = 0;
for (T ele : t) {
System.out.println("ele[" + (i++) + "] = " + ele);
}
}
  • 定义一个方法,把任意参数类型的集合中的数据安全地复制到相应类型的数组中
/**
* 定义一个方法,把任意参数类型的集合中的数据安全地复制到相应类型的数组中,体现了类型推断的传播性,T集合 与 T数组 的一致性
* @param source 源集合
* @param dest 目标数组
*/
private static <T> void copy(Collection<T> source, T[] dest) {
int i = 0;
for (T ele : source) {
dest[i++] = ele;
}
}
  • 定义一个方法,把任意参数类型的一个数组中的数据安全地复制到相应类型的另一个数组中
/**
* 定义一个方法,把任意参数类型的一个数组中的数据安全地复制到相应类型的另一个数组中
* @param source 源数组
* @param dest 目标数组
*/
private static <T> void copy(T[] source, T[] dest) {
int i = 0;
for (T ele : source) {
dest[i++] = ele;
}
}

JAVA基础_自定义泛型的更多相关文章

  1. Java基础教程:泛型基础

    Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...

  2. .NET基础之自定义泛型

    在.NET中泛型使用非常频繁,在控制台应用程序中,默认的引入了System.Collection.Generics名称空间,其中就提供了我们经常使用的泛型:List<T>和Dictiona ...

  3. JAVA基础_泛型

    什么是泛型 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉"类型"信息,是程序的运行效率不受影响 ...

  4. JAVA基础_反射获取泛型参数类型

    我经常会想获取参数的实际类型,在Hibernate中就利用的这一点. domain: Person.java public class Person { // 编号 private Long id; ...

  5. Java基础 -- 深入理解泛型

    一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大. 而泛型很好的解决了这个问题,这也是Java SE5的重大 ...

  6. java基础_集合List与Set接口

    List接口继承了Collection的方法  当然也有自己特有的方法向指定位置添加元素   add(索引,添加的元素); 移除指定索引的元素   remove(索引) 修改指定索引的元素   set ...

  7. Java基础教程(21)--泛型

    一.为什么使用泛型   泛型意味着编写的代码可以被很多不同类型的对象所重用.例如,我们不希望为存放String和Integer对象的集合设计不同的类.现在的ArrayList类可以存放任何类型的对象, ...

  8. java基础(7):自定义类、ArrayList集合

    1. 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好 ...

  9. 【BigData】Java基础_创建一个订单类

    需求描述 定义一个类,描述订单信息订单id订单所属用户(用户对象)订单所包含的商品(不定数量个商品对象)订单总金额订单应付金额:    总金额500~1000,打折85折    总金额1000~150 ...

随机推荐

  1. Mybatis3中@SelectProvider传递参数

    一.通常情况下我们使用实体类或者vo类来传递参数,这样可以在provider中直接使用#{param}来获取参数 二.在mybatis3.3以下版本只能传递一个参数,所以如果要传递多个参数必须封装成M ...

  2. MySQL日期格式化 利用Mysql的DATE_FORMAT()进行日期格式转换

    碰到一个MYSQL的问题,表logstatb中moment字段的内容是"年-月-日 时:分:秒",需要查询匹配“年月日”或“时:分:秒”即可的数据条目,这个时候就可以通过下面的SQ ...

  3. 49. ArrayList LinkedList中特有的方法

    集合的体系:--------------| Collection  单列集合的根接口 ----------| List 如果实现了List接口的集合类,该类具备的特点是:有序,可重复 ------|A ...

  4. HBase的应用场景及特点

    一.Hbase能做什么?1. 海量数据存储:上百亿行 x 上百万列并没有列的限制当表非常大的时候才能发挥这个作用, 最多百万行的话,没有必要放入hbase中2. 准实时查询:百亿行 x 百万列,在百毫 ...

  5. BZOJ 4031: [HEOI2015]小Z的房间(Matrix Tree)

    传送门 解题思路 矩阵树定理模板题.矩阵树定理是求图中最小生成树个数,做法是首先求出基尔霍夫矩阵,就是度数矩阵\(-\)邻接矩阵.然后再求出这个矩阵的行列式,行列式的求法就是任意去掉一行一列,然后高斯 ...

  6. NOIp2018集训test-9-5(pm)

    老张说:这套题太简单啦,你们最多两个小时就可以AK啦! 题 1 数数 我看到T1就懵了,这就是老张两个小时可以AK的题的T1?? 然后我成功地T1写了1h+,后面1h打了t2.t3暴力,就很开心. 等 ...

  7. NX二次开发-如何在类外面定义一个结构体

    #include <uf.h> #include <uf_obj.h> #include <uf_part.h> using namespace NXOpen; u ...

  8. spring 配置bean以及配置依赖 (2)

    目录 一.使用ref引用其他对象 二.通过有参构造器创建对象 1 通过index精确定位参数顺序 三.引用bean 1 使用内部bean 2 使用list,set 3 声明集合类型 四.其他 1 使用 ...

  9. Spring源码由浅入深系列五 GetBean

    获取bean的过程如上图所示.下一章将继续图示讲解createBean的过程.

  10. Docker搭建Portainer可视化界面

    为了解决上回说到的问题,在网上找了找 找到了一个 非常有好的可视化界面管理工具. Portainer 是什么东西 (开源轻量级) Portainer是Docker的图形化管理工具,提供状态显示面板.应 ...