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 ...
随机推荐
- 洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)
P2163 [SHOI2007]园丁的烦恼 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园 ...
- 2017 Chinese Multi-University Training, BeihangU Contest
2017 Chinese Multi-University Training, BeihangU Contest Add More Zero 思路:log10(2^m) = m*log10(2) 代码 ...
- 如何用 tensorflow serving 部署服务
第一步,读一读这篇博客 https://www.jb51.net/article/138932.htm (浅谈Tensorflow模型的保存与恢复加载) 第二步: 参考博客: https://blog ...
- php实现浏览器大文件分片上传
PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...
- 【luoguP1955 】[NOI2015]程序自动分析--普通并查集
题目描述 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足. 考虑一个约束满足问题的简化版本:假设x1,x2,x3...代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变 ...
- poj1737
Connected Graph POJ - 1737 An undirected graph is a set V of vertices and a set of E∈{V*V} edges.An ...
- [C语言]结构体初始化的不同方法
结构体的定义 struct Test{ int first; double second; }Sample; 方法一 定义时直接赋值 Sample s(1, 1.00); 缺点:必须匹配变量顺序,不能 ...
- 最小n个和(优先队列)
给出两个包含 nn 个整数的数组 AA,BB.分别在 AA, BB 中任意出一个数并且相加,可以得到 n^2n2个和.求这些和中最小的 nn 个. 输入格式输入第一行一个整数 n(1 \le n \l ...
- Kettle环境的安装
Kettle是绿色免安装的,下载完解压之后找到Spoon.bat,直接执行就好 欢迎界面 Kettle主要分为转换和作业2类 新建一个转换demo 创建了一个转换demo后,由于是数据抽取,因此我们抽 ...
- ubuntu进行apt-get时候出现Package ssh is not available, but is referred to by another package 错误
今天在ubuntu进行ssh安装的时候,出现如下错误. Reading package lists... Done Building dependency tree... Done Package s ...