java学习日志generic type(七)
来源:互联网 发布:温度转换 c语言 编辑:程序博客网 时间:2024/05/18 01:18
先看自定义泛型一例:
Queue.java
public class Queue<E>{ private E[] elements; private int head, tail; @SuppressWarnings("unchecked") Queue(int size) { if (size < 2) throw new IllegalArgumentException("" + size); elements = (E[]) new Object[size]; head = 0; tail = 0; } void insert(E element) throws QueueFullException { if (isFull()) throw new QueueFullException(); elements[tail] = element; tail = (tail + 1) % elements.length; } E remove() throws QueueEmptyException { if (isEmpty()) throw new QueueEmptyException(); E element = elements[head]; head = (head + 1) % elements.length; return element; } boolean isEmpty() { return head == tail; } boolean isFull() { return (tail + 1) % elements.length == head; } public static void main(String[] args) throws QueueFullException, QueueEmptyException { Queue<String> queue = new Queue<String>(6); System.out.println("Empty: " + queue.isEmpty()); System.out.println("Full: " + queue.isFull()); System.out.println("Adding A"); queue.insert("A"); System.out.println("Adding B"); queue.insert("B"); System.out.println("Adding C"); queue.insert("C"); System.out.println("Adding D"); queue.insert("D"); System.out.println("Adding E"); queue.insert("E"); System.out.println("Empty: " + queue.isEmpty()); System.out.println("Full: " + queue.isFull()); System.out.println("Removing " + queue.remove()); System.out.println("Empty: " + queue.isEmpty()); System.out.println("Full: " + queue.isFull()); System.out.println("Adding F"); queue.insert("F"); while (!queue.isEmpty()) System.out.println("Removing " + queue.remove()); System.out.println("Empty: " + queue.isEmpty()); System.out.println("Full: " + queue.isFull());}}
我们注意到 elements = (E[]) new Object[size];为什么这样声明呢?而不是 elements = new E[size];
这是因为java泛型的实现原则:数组创建的表达式中不能含有类型参数,也就是E[] elements = new E[size];是不对的;所以这样 new List<E>[50]也是错误的(a generic array creation error message)。
如果是在c++中,int *lpInt = new int[10];这是可以的。
而如果这样elements = (E[])new Queue<String>[size];也是不可以的,既然(定义一个泛型E)泛型声明,new的时候是不可以指定为实际的类型参数 String
虽然这样 elements = (E[]) new Queue<?>[size];是正确的表达,可以编译通过,但是运行的时候还是会报错:java.lang.ArrayStoreException;
这是因为企图填充一个无效的元素到数组中
- java学习日志generic type(七)
- java 泛型generic type
- java Generic Type/Parameterized Type/Raw Type
- java学习日志(七)-- 数组Array
- java generic -covariant return type
- Advanced Java generics: retreiving generic type arguments
- Linux学习日志(七)
- Java:泛型(generic)
- Java泛型(Generic)
- JAVA 泛型(generic)
- Java泛型(Generic)
- java 泛型(generic)
- yii2学习笔记(七)日志
- Python学习日志(七)之输入输出
- Java学习(七)
- Java学习(七)
- what is Generic type
- JDK 1.5 Generic Type
- opencv 环境安装
- 矩阵logm和expm的定义
- tshark命令行的使用
- iOS多线程编程指南(一)关于多线程编程
- 输入一个单向链表,输出该链表中倒数第k个结点
- java学习日志generic type(七)
- 子查询的使用位置
- C++ Hook IAT (基于IAT的Hook实践)
- 解决jQuery和其他库的冲突
- iOS多线程编程指南(二)线程管理
- cocos2d-x 渲染机制深入解析(一)
- c# 后台线程 进度条
- .jar, .war, .ear区别
- C和C++动态内存分配和释放的区别