通常而言,我们使用一种容器来存储一种类型的对象。而泛型的主要目的之一就是用来指定这个容器要持有什么类型的对象。因此,与其使用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. C#中怎么将XML作为参数post到接口

    String xml = "<data>中文</data>"; String postData = "data=" + Server.U ...

  2. python+Appium自动化:元素等待时间

    元素等待时间 为什么要设置等待时间呢?主要是因为界面加载时,为了防止元素还未出现影响后续的操作. 主要有三种方式:强制(线性)等待.隐式等待.显式等待 适用于appium和selenium 强制(线性 ...

  3. 性能分析之TCP全连接队列占满问题分析及优化过程(转载)

    前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的. 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时候, ...

  4. Bootstrap-轮播图-No.9

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  5. oracle split函数

    PL/SQL 中没有split函数,需要自己写. 代码: ); --创建一个 type ,如果为了使split函数具有通用性,请将其size 设大些. --创建function create or r ...

  6. jmeter-post请求自动变成get,提示请求方式错误,修改协议即可

    修改协议: http  改为  https  或反之

  7. BOOTING ELOQUENT MODEL TRAITS

    BOOTING ELOQUENT MODEL TRAITS So I've learnt a little Laravel/Eloquent trick today that is very much ...

  8. vundle

    vundle插件的使用方法: http://adam8157.info/blog/2011/12/use-vundle-to-manage-vim-plugins http://adam8157.in ...

  9. Wox使用指南

    下载安装 从下载地址下载最新版本的 wox ,我下载的是 exe 版的 Wox-1.3.578.exe 下载以后直接安装即可,不会有选择项,安装成功以后会在屏幕上出现一个搜索框,默认失去焦点以后搜索框 ...

  10. 【Redis 向Redis中批量导入mysql中的数据(亲自测试)】

    转自:https://blog.csdn.net/kenianni/article/details/84910638 有改动,仅供个人学习 问题提出:缓存的冷启动问题 应用系统新版本上线,这时候 re ...