通常而言,我们使用一种容器来存储一种类型的对象。而泛型的主要目的之一就是用来指定这个容器要持有什么类型的对象。因此,与其使用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. 使用php实现javascript的escape和unescape函数

    javascript有编码函数escape()和对应的解码函数unescape(),而php中只有个urlencode和urldecode,这个编码和解码函数对encodeURI和encodeURIC ...

  2. 关于SendMessage和PostMessage的理解的例子

    对于SendMessage 和 PostMessage 平时口头的解释是 SendMessage 发送消息后等待返回, PostMessage 发送消息后立即返回 . 但是这样解释还是不具体,什么叫等 ...

  3. 16-SQLServer强制走索引

    一.注意点 1.使用with(index(索引名称))来使SQL强制走索引. 二.示例截图 1.创建非聚集索引 2.不使用with,不走索引的截图 3.使用with,强制走索引的截图

  4. Java实现文件的上传下载(含源代码和jar包)

    1.需要使用的jar包 链接:https://pan.baidu.com/s/1IaxQRSwfzxDpe4w4JiaEKw 提取码:xwtz 2.如果想实现文件的下载,需要创建一张表,表的结构为 i ...

  5. initramfs机制

    1.什么是 Initramfs 在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统,然后内核检查rootfs ...

  6. Bootstrap-轮播图-No.5

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

  7. Codeforces Round #346 (Div. 2) B题

    B. Qualifying Contest Very soon Berland will hold a School Team Programming Olympiad. From each of t ...

  8. Luogu P1092 虫食算 爆搜

    心路历程:震惊,我竟然得了$90$分!!...康康数据...奥..(忽然有了邪恶的卡数据的想法) 于是把$for(int \space i=0;i<n;++i)$改成了$for(int \spa ...

  9. [Hihocoder] 字符串排序

    题目 http://hihocoder.com/problemset/problem/1712 题解 https://www.zybuluo.com/wsndy-xx/note/1135606

  10. Linux网络编程五、套接字超时

    1.accept超时 accept等待并接受连接请求的过程是阻塞的,可以通过IO转接来设置等待一定的时长,如果超时没有连接,就让这个函数返回,让当前进程/线程处理别的任务. 例: // 最大的文件描述 ...