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 ...
随机推荐
- 从程序员之死看 IT 人士如何摆脱低情商诅咒
(1) IT公司的创业者苏享茂忽然跳楼自杀了,自杀前,他留下几万字的文字记录.遗书,并且在自己开发的软件界面上,设置了弹出页面,控诉是恶毒前妻逼死了自己. 生命戛然而止,留给亲人痛苦,留给世人震惊. ...
- 02—EF初次体验
新建个表,我用的是sql server2014,我会把文件发上来,如果是低版本的,可以执行语句,数据库就自己创建吧. USE [testdb] GO CREATE TABLE [dbo].[Produ ...
- Java队列与栈转换中String.Valueof()使用
1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下 ...
- [唐胡璐]QTP技巧 - QTP菜单项消失
有时候QTP的菜单栏的下拉菜单为空。 解决方法:在菜单栏点击右键,选择“Customize”,在Customize窗口的ToolBarTab页,点击“Restore All”后即可。
- LINUX查看内存使用情况 free
# free 显示结果如下: Mem:表示物理内存统计 total 内存总数 8057964KB used 已使用的内存 7852484KB free 空闲的内存数 205480KB shared 当 ...
- CSS3 -- column 实现瀑布流布局
本例使用 CSS column 实现瀑布流布局 关键点,column-count: 元素内容将被划分的最佳列数 关键点,break-inside: 避免在元素内部插入分页符 html div.g-co ...
- 自定义类似smarty模板
自定义类封装模板解析功能 原理其实比较简单,就是把html文件解析为一个超级字符串,然后把类似{{$mytitle}}这种结构的变量进行替换(str_replace)当然,实际中这样做可能导致频繁的磁 ...
- goproxy
go env -w GOPROXY=https://goproxy.cn,directgo env -w GO111MODULE=ongo env -w GOBIN=$HOME/bin (可选)go ...
- PHP mysqli_fetch_row() 函数
定义和用法 mysqli_fetch_row() 函数从结果集中取得一行,并作为枚举数组返回. <?php // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con= ...
- 北京清北 综合强化班 Day1
a [问题描述]你是能看到第一题的 friends呢. —— hja何大爷对字符串十分有 ...