泛型的来源

在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. 14. static(静态) 关键字

    1.修饰成员变量 1)定义:数据需要被共享给所有对象使用使用static修饰(全局变量) 2)注意: 1.用static中创建的成员变量在内存中只有一份 2.千万不要为了方便访问数据而使用static ...

  2. CSS——背景及应用

    CSS 可以添加背景颜色和背景图片,以及进行图片设置. none : 无背景图(默认的) url : 使用绝对或相对地址指定背景图像 background-image 属性允许指定一个图片展示在背景中 ...

  3. Swift 环境搭建

    Swift 环境搭建 Swift是一门开源的编程语言,该语言用于开发OS X和iOS应用程序. 在正式开发应用程序前,我们需要搭建Swift开发环境,以便更好友好的使用各种开发工具和语言进行快速应用开 ...

  4. 高危预警|RDP漏洞或引发大规模蠕虫爆发,用户可用阿里云免费检测服务自检,建议尽快修复

    2019年9月6日,阿里云应急响应中心监测到Metasploit-framework官方在GitHub空间公开了针对Windows远程桌面服务远程命令执行漏洞(CVE-2019-0708)的利用代码. ...

  5. bzoj3505: [Cqoi2014]数三角形 [数论][gcd]

    Description 给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个.下图为4x4的网格上的一个三角形. 注意三角形的三点不能共线. Input 输入一行,包含两个空格分隔的正整数m和 ...

  6. 线段树区间离散化——牛客多校E

    这个区间离散化把我调死了.. 总之用vector来离散化,然后叶子节点维护的是一段区间,记录下每个叶子结点的起点+长度 千万要注意下标不能弄错! #include<bits/stdc++.h&g ...

  7. 阶乘质因子分解——lightoj1035

    #include<bits/stdc++.h> using namespace std; #define ll long long #define maxn 200 int primes[ ...

  8. hive中的lateral view 与 explode函数的使用

    hive中的lateral view 与 explode函数的使用 背景介绍: explode与lateral view在关系型数据库中本身是不该出现的. 因为他的出现本身就是在操作不满足第一范式的数 ...

  9. 使用Beyond Compare作为Perforce默认的文件比较工具

    使用perforce自带的文件比较工具有时候会遇到乱码的情况,如下: 暂时不知道如何解决上述问题,因此想换个文件比对工具,比如Beyond Compare. 设定位置:Edit->prefere ...

  10. <router-link :to="...">

    一.<router-link :to="..."> to里的值可以是一个字符串路径,或者一个描述地址的对象.例如: // 字符串<router-link to=& ...