泛型的来源

在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. vue 学习二 深入vue双向绑定原理

    vue双向绑定原理 请示总体来讲 就是为data的中的每个属性字段添加一个getter/seter属性 以此来追踪数据的变化,而执行这部操作,依赖的就是js的Object.defineProperty ...

  2. css的3d注意事项

    1,如果要写出立体效果,所有的父容器都要添加属性transform-style: preserve-3d;不然子元素不能进行3d变换:背景色要写到最外层容器,且不能有transform-style: ...

  3. 使用 async await 封装微信小程序HTTP请求

    1. 编写将普通回调函数形式的方法转换为promise方法的promisic方法 // util.js const promisic = function (func) { return functi ...

  4. TS-接口

    接口 TS的核心原则之一是对值所具有的结构进行类型检测 接口初探 function printLabel(labelledObj: { label: string }) { console.log(l ...

  5. Redis Desktop Manager可视化工具连接不上redis

    1.在centos中启动redis之后,redis进程也是可查的,但是一连接可视化工具就报错: can't connect to redis-server 2.原因分析: ①首先redis是肯定已经开 ...

  6. noip 2014 总结

    2014 年的noip 已经结束了,成绩从个人而言不是特别的理想,从今年题的逗的程度,本来是个xxx 就被玩脱了= = 当然现在后悔事没有用的了,不过第二天全屏技术的在最后一小时看到了两道题的错误,然 ...

  7. Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

    $*********************************************************************************************$ 博主推荐 ...

  8. NX二次开发-NXOPEN创建工程图表格Annotations::TableSectionBuilder *tableSectionBuilder1;

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  9. 去除vim ^M符号

    来自: https://zhidao.baidu.com/question/267905868.html 有两种情况,会出现打开的文件都显示^M符号:1. vim被配置为fileformat=unix ...

  10. CSS3新属性之---flex box布局实例

    flex box布局实例 flex的强大之处在于不管什么布局,几行命令即可实现 /*本节模板div元素(代表骰子的一个面)是Flex容器,span元素(代表一个点)是Flex项目.如果有多个项目,就要 ...