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 ...
随机推荐
- HDU - 3506 Monkey Party
HDU - 3506 思路: 平行四边形不等式优化dp 这不就是石子归并(雾 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma G ...
- FasterRunner (httptunner+django)搭建以及小功能补充
配置 下载地址https://github.com/httprunner/FasterRunner 后端配置https://www.jianshu.com/p/e26ccc21ddf2 前端配置htt ...
- python .pth 文件 和 site 模块
python .pth 文件 和 site 模块 .pth 文件 该文件位于 python 的 /Lib/site-packages 目录下,可以有多个,在 .pth 文件中可以把其它目录添加到 sy ...
- iOS 中通过kvc 获取数组的均值、求和、最大最小值等
NSArray *values = @[@, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @, @]; NSNumber *avg = [values valu ...
- LVS Nginx和HAproxy的区别,怎么选择最好
LVS Nginx和HAproxy有什么区别呢? LVS:Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. Nginx:Nginx是一款轻量级的w ...
- 性能分析之TCP全连接队列占满问题分析及优化过程(转载)
前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的. 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时候, ...
- Jmeter设置集合点(并发测试)
什么是集合点? 让所有请求在不满足条件的时候处于等待状态. 如何实现? 使用jmeter中的同步计时器Synchronizing Timer来实现 集合点的位置 因为集合点是在取样器sampler(例 ...
- Codeforces Round #589 (Div. 2) C - Primes and Multiplication(数学, 质数)
链接: https://codeforces.com/contest/1228/problem/C 题意: Let's introduce some definitions that will be ...
- shell拷贝文件到另一台机器
#!/bin/bash data=$(date "+%Y-%m-%d %H:%M:%S") ip='192.168.10.14' password='fan' gitBak='/v ...
- Call JMS Web Service
The content type application/json of the response message does not match the content type of the bin ...