JAVA基础_自定义泛型
泛型的来源
在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基础_自定义泛型的更多相关文章
- Java基础教程:泛型基础
Java基础教程:泛型基础 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚 ...
- .NET基础之自定义泛型
在.NET中泛型使用非常频繁,在控制台应用程序中,默认的引入了System.Collection.Generics名称空间,其中就提供了我们经常使用的泛型:List<T>和Dictiona ...
- JAVA基础_泛型
什么是泛型 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉"类型"信息,是程序的运行效率不受影响 ...
- JAVA基础_反射获取泛型参数类型
我经常会想获取参数的实际类型,在Hibernate中就利用的这一点. domain: Person.java public class Person { // 编号 private Long id; ...
- Java基础 -- 深入理解泛型
一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大. 而泛型很好的解决了这个问题,这也是Java SE5的重大 ...
- java基础_集合List与Set接口
List接口继承了Collection的方法 当然也有自己特有的方法向指定位置添加元素 add(索引,添加的元素); 移除指定索引的元素 remove(索引) 修改指定索引的元素 set ...
- Java基础教程(21)--泛型
一.为什么使用泛型 泛型意味着编写的代码可以被很多不同类型的对象所重用.例如,我们不希望为存放String和Integer对象的集合设计不同的类.现在的ArrayList类可以存放任何类型的对象, ...
- java基础(7):自定义类、ArrayList集合
1. 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好 ...
- 【BigData】Java基础_创建一个订单类
需求描述 定义一个类,描述订单信息订单id订单所属用户(用户对象)订单所包含的商品(不定数量个商品对象)订单总金额订单应付金额: 总金额500~1000,打折85折 总金额1000~150 ...
随机推荐
- WPF 模仿 UltraEdit 文件查看器系列一 用户控件
WPF 模仿 UltraEdit 文件查看器系列一 用户控件 运行环境:Win10 x64, NetFrameWork 4.8, 作者:乌龙哈里,日期:2019-05-10 章节: 起步 添加用户控件 ...
- 自己的php框架
spl_autoload_register('imooc::load');当我们new的类不存在,将触发括号里的方法. is_file()判断文件是否存在.
- 字符串dp——牛客多校第五场G
比赛的时候脑瘫了没想出来..打多校以来最自闭的一场 显然从s中选择大于m个数组成的数必然比t大,所以只要dp求出从s中选择m个数大于t的方案数 官方题解是反着往前推,想了下反着推的确简单,因为高位的数 ...
- [NOI.AC] candy
题意:求净利益. 思路: 其实我也不怎么懂题面. 不过这种题一般来说就是从最大的开始选. 所以考虑贪心. 那么代价如何处理呢?? 我们考虑两个序列同时选数,把代价每次记录到一个序列的和上,那么对于两次 ...
- LeetCode 182. Duplicate Emails (查找重复的电子邮箱)
题目标签: 题目给了我们一个 email 的table,让我们找到重复的 email. 可以建立 Person a, Person b, 找到两个表格中,emai 相等 但是 id 不同的 email ...
- iOS开发之UIMenuController
1.简介 用于剪切.复制.粘贴.选择.选择ALL和DELETE命令的菜单界面. UITextField.UIWebView.UITextView自带有这种UIMenuController效果: 2.相 ...
- 使用nginx访问本地电脑的目录文件
cat /usr/local/opt/nginx/ //nginx路径 cd /usr/local/opt/nginx/html //localhost的指向 ln -s ~/Documents do ...
- 20130324 LBP CSLBP 全局存储区 局部存储区 char c[]=”hello world”和char *str=”hello world”的区别
1.LBP and CSLBP 2.再论char c[]=”hello world”和char *str=”hello world”的区别 /**************代码1************ ...
- jquery操作html元素之( 尺寸)
jQuery 提供多个处理尺寸的重要方法: width() height() innerWidth() innerHeight() outerWidth() outerHeight() jQuery ...
- C盘清理垃圾
经常清理C盘垃圾,会让系统运行更快,避免死机,今天教大家一种简单实用的方法,用文本文档清理垃圾: 1:在电脑桌面空白处右键-建立文本文档: 2:把以下代码复制到文本里 @echo offecho 正在 ...