泛型的来源

在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. CSIC_716_20191206【并发编程理论基础】

    进程:正在执行的一个过程,进程是对正在执行过程的一个抽象.区别于程序, 进程的三种状态:  进程是动态的. 就绪态ready:   进程具备运行状态,等待操作系统分配处理器 运行状态running:进 ...

  2. Servlet 上传图片

    目录 Servlet 上传图片 预备 需求包 pom 前端代码 Servlet 上传图片 预备 需求包 commons-fileupload -用于上传 jstl -用于jsp页面遍历 servlet ...

  3. leetcood学习笔记-83-删除链表中的重复元素

    题目描述: 第一次提交: class Solution: def deleteDuplicates(self, head: ListNode) -> ListNode: if head==Non ...

  4. re.match与re.search的区别

    re.match与re.search的区别 re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None:而re.search匹配整个字符串,直到找到一个匹配. 实 ...

  5. git Web

    { …or create a new repository on the command line   echo "# Kotlin" >> README.md git ...

  6. thinkphp 模块部署

    3.2对模块的访问是自动判断的,所以通常情况下无需配置模块列表即可访问,在部署模块的时候,默认情况下都是基于类似于子目录的URL方式来访问模块的,例如: http://serverName/Home/ ...

  7. zookeeper基本概述

    zookeeper是一个分布式的协调服务框架 其本质是一个分布式的小文件存储系统,可以存储一些小的文件,官方建议每个小文件不要超过一兆 zk一般都是装奇数台,便于zk内部的一些投票选举 leader: ...

  8. NX二次开发-创建经典工具栏UF_UI_create_toolbar

    NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...

  9. mysql查看数据库大小或者表大小

    要想知道每个数据库的大小的话,步骤如下: 1.进入information_schema 数据库(存放了数据库的信息) use information_schema; 2.查询所有数据库的大小: sel ...

  10. Python正则表达式如何进行字符串替换实例

    Python正则表达式如何进行字符串替换实例 Python正则表达式在使用中会经常应用到字符串替换的代码.有很多人都不知道如何解决这个问题,下面的代码就告诉你其实这个问题无比的简单,希望你有所收获. ...