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开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...
随机推荐
- Spring实战(第4版)
第1部分 Spring的核心 Spring的两个核心:依赖注入(dependency injection,DI)和面向切面编程(aspec-oriented programming,AOP) POJO ...
- 对List<Map>里的map的某个属性重复的值进行处理的方法
package test; import java.util.*;import java.util.stream.Collectors; public class Test5 { public sta ...
- firefox ie 比较 relative path
relative path 对于firefox ie 来说是不同的 在ie中 <base href="/">起基础url作用 此时 <a href="& ...
- JavaScript数组的简单介绍
㈠对象分类 ⑴内建对象 ⑵宿主对象 ⑶自定义对象 ㈡数组(Array) ⑴简单介绍 ①数组也是一个对象 ②它和我们普通对象功能类似,也是用来存储一些值的 ③不同的是普通对象是使用字符串作为属性名的 ...
- [Luogu] 树
https://www.luogu.org/problemnew/show/P4092 树剖 + 线段树区间修改,单点查询 #include <bits/stdc++.h> using n ...
- 2019 南昌ICPC网络赛H The Nth Item
The Nth Iteam 题意:F(0)=1,F(1)=1,F(n)=3*F(n-1)+2*F(n-2) (n>=2) ,F(n) mod 998244353.给出Q跟N1,Ni=Ni-1^( ...
- Linux之GDB调试命令
gdb启动 gdb 程序名 l 查看源代码(默认显示十行) l 文件名:行数 l 文件名:函数名 添加断点 break + 行数 (b 也行) b 15 if i == 15 条件断点 i b 查看断 ...
- nohup 的含义
)./a.sh &,&对SIGINT 信号免疫程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程.Ctrl + C,a ...
- [Linux]虚拟机无法安装deepin15.9的解决方案
虚拟机deepin15.9无法安装 sda assuming drive cache write through 显示内存不行,重启仍然无法安装 解决方案: 选择全盘安装方式 如果有全屏问题,需安装v ...
- Codeforces 55D. Beautiful numbers(数位DP,离散化)
Codeforces 55D. Beautiful numbers 题意 求[L,R]区间内有多少个数满足:该数能被其每一位数字都整除(如12,24,15等). 思路 一开始以为是数位DP的水题,觉得 ...