通常而言,我们使用一种容器来存储一种类型的对象。而泛型的主要目的之一就是用来指定这个容器要持有什么类型的对象。因此,与其使用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):概述的更多相关文章

  1. java泛型梳理

    java泛型梳理 概述 泛型,即参数化类型,是在JDK1.5之后才开始引入的. 所谓参数化类型是指所操作的数据类型在定义时被定义为一个参数,然后在使用时传入具体的类型. 这种参数类型可以用在类,接口, ...

  2. JAVA之旅(二十一)——泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符

    JAVA之旅(二十一)--泛型的概述以及使用,泛型类,泛型方法,静态泛型方法,泛型接口,泛型限定,通配符 不知不觉JAVA之旅已经写到21篇了,不得不感叹当初自己坚持要重学一遍JAVA的信念,中途也算 ...

  3. Java泛型概述

    泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理,以及让人苦恼的类型擦除. 泛型基础 泛型类 我们首先定义 ...

  4. 18.Java泛型

    1.为什么需要泛型 List list1=new ArrayList(Arrays.asList(new String("string"),new Integer(20))); S ...

  5. Java泛型-类型擦除

    一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...

  6. 学习记录 java泛型资料

    java泛型资料: 1. 概述在引入范型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型就可以在细分成更多的类型.例如原先的类型List,现在在细分成Lis ...

  7. java基础(十二 )-----Java泛型详解

    本文对java的泛型的概念和使用做了详尽的介绍. 概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即“参数化类型”.一提到 ...

  8. java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一

    对java的泛型特性的了解仅限于表面的浅浅一层,直到在学习设计模式时发现有不了解的用法,才想起详细的记录一下. 本文参考java 泛型详解.Java中的泛型方法. java泛型详解 1. 概述 泛型在 ...

  9. java 泛型 精析

      Created by Marydon on 1.概述 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数: 这种参数类型可以用在类.接口和方法的 ...

  10. Notes 20180506 : Java程序设计语言概述

    2.Java程序设计语言概述 如果对于开发语言的排行榜有所关注的话,那么会发现很长一段时间以来Java都是位居榜首的高级开发语言,作为一个Java开发者,为此感到骄傲的同时也深感忧虑,骄傲的是自己接触 ...

随机推荐

  1. 一些网站后台模板源码分析 Particleground.js 验证码

    转: https://blog.csdn.net/bcbobo21cn/article/details/51271750 1 灰色简洁企业后台管理模板 效果: 看下项目结构: 它使用了moderniz ...

  2. R的数据结构--向量

    向量:用于存储数值型.字符型或逻辑型数据的一维数组,只可以包含一种数据 向量的创建与运算 创建向量 # 创建简单向量 l <- c(2, 2, 1, 3, 8) # [1] 2 2 1 3 8 ...

  3. hlslcc

    https://cdn2.unrealengine.com/Resources/files/UE4_OpenGL4_GDC2014-514746542.pdf ue的跨平台编译器 hlsl cross ...

  4. 干货 | 以太坊Mist负责人教你建立无服务器应用

    作者:Alex Van de Sande译者:王建/蔡佳慧译者介绍: 王建:万云平台区块链技术专家,拥有多年应用系统架构经验,目前在区块链落地方面进行积极探索 蔡佳慧:万云平台实习生,区块链技术爱好者 ...

  5. C# IP地址和DNS 网络(三)

    Uri i = new Uri("http://www.baidu.com"); //可获取属性 UriBuilder u = new UriBuilder("http: ...

  6. Acwing-286-选课(树上DP)

    链接: https://www.acwing.com/problem/content/288/ 题意: 学校实行学分制. 每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分. 学校开设了 N ...

  7. MFC 线程的创建,线程函数在类内、类外

    [线程的创建] AfxBeginThread(类外的线程函数,NULL); AfxBeginThread(类内的线程函数,(LPVOID)this); [类外线程函数] UINT 函数名(LPVOID ...

  8. add(expr|ele|html|obj[,con]) 把与表达式匹配的元素添加到jQuery对象中。

    add(expr|ele|html|obj[,con]) 概述 把与表达式匹配的元素添加到jQuery对象中.这个函数可以用于连接分别与两个表达式匹配的元素结果集. jQuery 1.4 中, .ad ...

  9. HydroCMS-用ueditor无法实现word中图片转存的问题

    图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM ...

  10. HZOJ 20190819 NOIP模拟26题解

    考试过程: 照例开题,然后觉得三道题都挺难,比昨天难多了(flag×1),T1 dp?T2 数据结构? T3 dp?事实证明我是sb然后决定先搞T2,但是,woc,这题在说什么啊,我怎么看不懂题啊,连 ...