Java泛型(3):泛型方法
泛型还可以同样运用在方法。是否拥有泛型方法与其所在的类是否是泛型类没有关系。
无论何时,只要你能做到,都应该尽量使用泛型方法,如果泛型方法可以取代将整个类整个类泛型化,那么就应该只使用泛型方法。
下面是几个泛型方法的例子。
(1) 利用泛型方法和可变参数列表为List添加元素
import java.util.ArrayList;
import java.util.List; public class GenericVarargs {
@SafeVarargs
public static <T> List<T> make(T... args) {
List<T> result = new ArrayList<T>();
for (T arg : args) {
result.add(arg);
}
return result;
}
}
// 利用泛型方法和可变参数列表为List添加元素。
List<Integer> result = GenericVarargs.make(1, 2, 3);
System.out.println(result.get(0) + "/" + result.get(1) + "/" + result.get(2)); // 1/2/3
(2) 一个更通用的对象生成器例子,可以为任何类构造一个Generator,以便用next()更方便批量生成对象
public interface Generator<T> {
T next();
}
public class GenerateObject<T> implements Generator<T> {
private Class<T> type;
private GenerateObject(Class<T> type) {
this.type = type;
}
@Override
public T next() {
try {
return type.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static <T> GenerateObject<T> create(Class<T> type) {
return new GenerateObject<T>(type);
}
}
public class CountedObject {
private static int count = 0;
private final long id = ++count;
public String toString() {
return "CountedObject " + id;
}
}
// 一个更通用的对象生成器例子,可以为任何类构造一个Generator,以便更方便批量生成对象
Generator<CountedObject> gen = GenerateObject.create(CountedObject.class);
for (int i = 0; i < 3; i++) {
System.out.println(gen.next());
// CountedObject 1
// CountedObject 2
// CountedObject 3
}
(3) 一个Set的实用工具,可以模拟数学中交集并集的处理
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; public class SetUtils { // 两个Set取并集
public static <T> Set<T> union(Set<T> a, Set<T> b) {
Set<T> result = new HashSet<T>(a);
result.addAll(b);
return result;
} // 两个Set取交集
public static <T> Set<T> intersection(Set<T> a, Set<T> b) {
Set<T> result = new HashSet<T>(a);
result.retainAll(b);
return result;
} // 从MainSet减去SubSet
public static <T> Set<T> difference(Set<T> mainset, Set<T> subset) {
Set<T> result = new HashSet<T>(mainset);
result.removeAll(subset);
return result;
} // 取不在交集里的值
public static <T> Set<T> complement(Set<T> a, Set<T> b) {
return difference(union(a, b), intersection(a, b));
} // 打印
public static <T> String printSet(Set<T> set) {
StringBuilder sb = new StringBuilder();
Iterator<T> elem = set.iterator();
while (elem.hasNext()) {
sb.append(elem.next());
if (elem.hasNext()) {
sb.append(", ");
}
}
return sb.toString();
}
}
// 一个Set的实用工具,可以模拟数学中交集并集的处理
Set<Integer> set1 = new HashSet<>(GenericVarargs.make(1, 2, 3, 4, 5));
Set<Integer> set2 = new HashSet<>(GenericVarargs.make(4, 5, 6, 7, 8));
System.out.println(SetUtils.printSet(SetUtils.union(set1, set2))); // 1, 2, 3, 4, 5, 6, 7, 8
System.out.println(SetUtils.printSet(SetUtils.intersection(set1, set2))); // 4, 5
System.out.println(SetUtils.printSet(SetUtils.difference(set1, set2))); // 1, 2, 3
System.out.println(SetUtils.printSet(SetUtils.difference(set2, set1)));// 6, 7, 8
System.out.println(SetUtils.printSet(SetUtils.complement(set1, set2))); // 1, 2, 3, 6, 7, 8
Java泛型(3):泛型方法的更多相关文章
- Java 泛型示例 - 泛型方法,类,接口
Java Genrics 是 Java 5 中引入的最重要的功能之一. 如果您一直在使用Java Collections并使用版本 5 或更高版本,那么我确定您已经使用过它. Java 中具有集合类的 ...
- java泛型-自定义泛型方法与类型推断总结
下面是自定义泛型方法的练习: package com.mari.generic; import java.util.ArrayList; import java.util.Collection; im ...
- java 泛型 -- 泛型类,泛型接口,泛型方法
泛型T泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束.在定义泛型类或声明泛型类的变量时,使用尖括号来指定形式类型参数.形式类型参数与实际类型参数之间的关系类似于形式方 ...
- Java 泛型 泛型方法
Java 泛型 泛型方法 @author ixenos 泛型方法可以定义在普通类中,也可以定义在泛型类中 类型变量放在修饰符(如public static)后面,返回类型的前面 一个static方法无 ...
- (一)关于java泛型的学习总结(泛型方法、泛型擦除)
目录概要 一.泛型方法 二.利用泛型方法的特性实现代码的简化 三. 关于泛型的擦除 四.无界通配符和原生类型区别 五.转型和警告 泛型 一般的类中的属性或方法的参数,只能使用具体的类型:要么是基本 ...
- java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)
JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java ...
- java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在 ...
- 浅析Java 泛型
泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...
- Java:泛型基础
泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...
- java泛型基础
泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法. Ja ...
随机推荐
- jenkins 配置主从机制(master-slaver)
1. 中文:系统管理——节点管理——新建节点(左上侧) 英文:Manage Jenkins——Manage Node——新建节点(左上侧) 2. 中文配图 英文配图: 3. 远程工作目录 以mac为例 ...
- layui多图上传实现删除功能
在使用layui的多图上传时发现没有删除功能 在网上搜索解决办法时有的感觉太复杂有的不符合自己所需要的所以就自己动手 下面附上代码 HTML: <div class="layui-up ...
- MyBatis-05-解决属性名和字段名不一致的问题
5.解决属性名和字段名不一致的问题 1.问题 数据库中的字段 新建一个项目,拷贝之前的,测试实体类字段不一致的情况. public class User { private int id; priva ...
- jenkins"控制台输出"乱码问题解决
今天在搭建Jenkins环境时,安装完Tomcat.Jenkins.创建项目进行构建后,在查看控制台输出时,结果中文全部显示乱码.然后呢,就是漫长的解决历程,最终呢,解决乱码问题的时间终于超过了环境搭 ...
- crontab踩坑(一)
因为 我们用conda托管了python虚拟环境,我自身的环境是wqbin,本来crontab脚本的命令是如下: 发生了如下的报错: 因为这里的环境是启动的是base的 所以找不相应的模块.于是我在执 ...
- 长春理工大学第十四届程序设计竞赛H Arithmetic Sequence——使用特例
题目 链接 题意:给定一个数X,输出一个等差数列,使得和为X. 分析 由等差数列的定义,可见一个数就是等差数列,两个数也是等差数列 #include<bits/stdc++.h> usin ...
- ACM-ICPC 2017 沈阳赛区现场赛 M. Wandering Robots && HDU 6229(思维+期望)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6229 参考题解:https://blog.csdn.net/lifelikes/article/det ...
- HZWER
我们的征途是星辰大海 2016年3月13日8,8077 尊敬的各位老师.亲爱的同学们: 大家好,我是高三(1)班的黄哲威.今天很荣幸能和大家分享一些有关竞赛的心得体会. 去年7月15日,第32届全国信 ...
- jQuery系列(六):jQuery的文档操作
1.插入操作 (1) 语法: 父元素.append(子元素) 解释:追加某元素,在父元素中添加新的子元素.子元素可以为:stirng | element(js对象) | jquery元素 let ol ...
- linux下如何编辑txt文档
利用vi命令 [root@bogon a]# vi a.txt 打开a.txt文档 vi a.txt后,键盘敲i,可以进入编辑模式, 输入完内容后按ESC键,键盘输入 :wq 可以保存并退出 ...