Java泛型(1):概述
通常而言,我们使用一种容器来存储一种类型的对象。而泛型的主要目的之一就是用来指定这个容器要持有什么类型的对象。因此,与其使用Object,我们可以暂时不指定类型。
看下面3个例子:
(1) 我们有时候想调用一个方法返回多个返回值,但是又不想单独再创建一个类。我们可以将一组对象直接打包放在一个元组中。这个容器处始化后,只允许读取其中元素,不能再写入(final域)。
public class TwoTuple<A, B> {
public final A first;
public final B second;
public TwoTuple(A first, B second) {
this.first = first;
this.second = second;
}
}
public class ThreeTuple<A, B, C> extends TwoTuple<A, B> {
public final C third;
public ThreeTuple(A first, B second, C third) {
super(first, second);
this.third = third;
}
}
public class TupleUtils {
public static <A, B> TwoTuple<A, B> initTuple(A a, B b) {
return new TwoTuple<A, B>(a, b);
}
public static <A, B, C> ThreeTuple<A, B, C> initTuple(A a, B b, C c) {
return new ThreeTuple<A, B, C>(a, b, c);
}
// four five ...
}
Main方法测试:
TwoTuple<Integer, String> twoTuple = TupleUtils.initTuple(1, "aaa");
ThreeTuple<Integer, String, String> threeTuple = TupleUtils.initTuple(2, "bb", "cc");
System.out.println(twoTuple.first + "/" + twoTuple.second); // 1/aaa
System.out.println(threeTuple.first + "/" + threeTuple.second + "/" + threeTuple.third); // 2/bb/cc
(2) 一个自己实现的泛型堆栈例子(模拟链表实现)
public class LinkStack<T> {
private class Node<U> {
U item;
Node<U> next; // 相当于一个指针
Node() {
}
Node(U item, Node<U> next) {
this.item = item;
this.next = next;
}
boolean isEnd() {
return item == null && next == null;
}
}
// 末断哨兵,这个指针总是指向栈顶
private Node<T> top = new Node<T>();
public LinkStack<T> push(T item) {
top = new Node<T>(item, top);
return this;
}
public T pop() {
T result = top.item;
if (!top.isEnd()) {
top = top.next;
}
return result;
}
}
Main方法测试:
LinkStack<Integer> stack = new LinkStack<>();
stack.push(1).push(2).push(3);
System.out.println(stack.pop() + "/" + stack.pop() + "/" + stack.pop() + "/" + stack.pop()); // 3/2/1/null
(3) 一个随机取对象的容器类
public class RandomList<T> {
public final List<T> storage;
private Random ran;
public RandomList(List<T> storage) {
if (storage == null || storage.size() == 0) {
throw new RuntimeException("List must not be empty!");
}
this.storage = storage;
// 不设定种子。种子相同,即使实例不同也产生相同的随机数。
ran = new Random();
}
public T select() {
if (storage.size() == 0) {
return null;
}
// 随机的int值,介于[0,n)的区间
int pos = ran.nextInt(storage.size());
T result = storage.get(pos);
storage.remove(pos);
return result;
}
}
Main方法测试:
// Arrays.asLisvt()返回java.util.Arrays$ArrayList,而不是ArrayList。
// Arrays$ArrayList和ArrayList都是继承AbstractList,但是remove,add等method在AbstractList中是默认throw UnsupportedOperationException。
// 所以不能用以下写法。
// List<Integer> dataList = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> dataList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
RandomList<Integer> ranList = new RandomList<>(dataList);
System.out.println(ranList.select() + "/" + ranList.select() + "/" + ranList.select() + "/" + ranList.select()
+ "/" + ranList.select() + "/" + ranList.select()); // 4/2/5/3/1/null(一种结果)
Java泛型(1):概述的更多相关文章
- java泛型梳理
java泛型梳理 概述 泛型,即参数化类型,是在JDK1.5之后才开始引入的. 所谓参数化类型是指所操作的数据类型在定义时被定义为一个参数,然后在使用时传入具体的类型. 这种参数类型可以用在类,接口, ...
- JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符
JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...
- Java泛型概述
泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首先定义 ...
- 18.Java泛型
1.为什么需要泛型 List list1=new ArrayList(Arrays.asList(new String("string"),new Integer(20))); S ...
- Java泛型-类型擦除
一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...
- 学习记录 java泛型资料
java泛型资料: 1. 概述在引入范型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型就可以在细分成更多的类型.例如原先的类型List,现在在细分成Lis ...
- java基础(十二 )-----Java泛型详解
本文对java的泛型的概念和使用做了详尽的介绍. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”.一提到 ...
- java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在 ...
- java 泛型 精析
Created by Marydon on 1.概述 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数: 这种参数类型可以用在类.接口和方法的 ...
- Notes 20180506 : Java程序设计语言概述
2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...
随机推荐
- requests模拟浏览器请求模块初识
requests模拟浏览器请求模块初识 一.下载 requests模拟浏览器请求模块属于第三方模块 源码下载地址http://docs.python-requests.org/zh_CN/lates ...
- [唐胡璐]Selenium技巧- 抓图并保存到TestNG报告中
这里不讲解怎么在Eclipse安装配置TestNG,网上一搜一大把,大家自己去实践一下。 在这里主要说一下用Java来实现Selenium Webdriver的截图功能和把截图写到TestNG的报告中 ...
- 前端小白页面开发注意事项及小工具(html\css\js)
技术一直在向前发展.但是有一些是相通的,要找准重点,将80%的时间放在提升基础问题上,余下的20%再去学习框架,库和工具. HTML 1. HTML 属性应当按照以下给出的顺序依次排列,确保代码的易读 ...
- Codeforces Round #587 (Div. 3) A. Prefixes
链接: https://codeforces.com/contest/1216/problem/A 题意: Nikolay got a string s of even length n, which ...
- springbootdruidmybatismysql多数据源事务管理
springboot+druid+mybatis+mysql+多数据源事务管理 分布式事务在java中的解决方案就是JTA(即Java Transaction API):springboot官方提供了 ...
- wnmp安装配置的坑
1.下载安装nginx: nginx官网下载地址->下载nginx 下载任意版本.我下载的是1.13.12版本,解压到C:\wnmp\nginx(自己决定目录),运行nginx.exe. 访问h ...
- mac使用php-version切换PHP版本
在开发过程中,有时候我们的程序对某个php版本有着极为重要的限制,特别是大型项目. 因此,我们就需要切换多个php版本来满足我们的需求. 我们使用php-version来达到这个目的. 首先我们先使用 ...
- MySql数据类型及对应存储空间
整数型数据类型 类型名称 说明 存储需求 TINYINT 很小的正数 1个字节 SMALLINT 小正数 2个字节 MEDIUMINT 中等大小的正数 3个字节 INT(INTEGER) 普通大小的正 ...
- mac使用frida
mac使用frida 安装 https://github.com/frida/frida/releases 根据手机的cpu的版本,选择相应的文件,一般通过手机信息可以看到 我这里是frida-ser ...
- centos7下面安装tomcat
前言 对于一个新安装的 centos 系统来说,是没有 tomcat 服务器的.用下面的命令可以查看 tomcat 服务的状态. systemctl status tomcat.service//或者 ...