From a17ea15649152d28dbc9f677df5a819a930f10a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=89=E5=8B=87=E5=BC=BA2?= Date: Tue, 26 Nov 2019 20:16:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=85=88=E8=80=83=E8=99=91=E6=B3=9B?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch05泛型/29.优先考虑泛型.md | 15 ++++++ .../java/com/jueee/item29/Item29Example01.java | 51 +++++++++++++++++++ .../java/com/jueee/item29/Item29Example02.java | 51 +++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 ch05泛型/29.优先考虑泛型.md create mode 100644 ch05泛型/Generics/src/main/java/com/jueee/item29/Item29Example01.java create mode 100644 ch05泛型/Generics/src/main/java/com/jueee/item29/Item29Example02.java diff --git a/ch05泛型/29.优先考虑泛型.md b/ch05泛型/29.优先考虑泛型.md new file mode 100644 index 0000000..02b7302 --- /dev/null +++ b/ch05泛型/29.优先考虑泛型.md @@ -0,0 +1,15 @@ +## 优先考虑泛型 + + + +- [Item29Example01.java](Generics/src/main/java/com/jueee/item29/Item29Example01.java):简单堆栈实现。 + +- [Item29Example02.java](Generics/src/main/java/com/jueee/item29/Item29Example02.java):泛型化的堆栈实现。 + + 泛型化类的第一步是在其声明中添加一个或多个类型参数。 在这种情况下,有一个类型参数,表示堆栈的元素类型,这个类型参数的常规名称是 E 。 + + 消除 `Stack` 中的泛型数组创建错误的第二种方法是将属性元素的类型从 `E[]` 更改为 `Object[]`。 + +绝大多数泛型类型就像我们的 `Stack` 示例一样,它们的类型参数没有限制:可以创建一个 `Stack,Stack`,`Stack>` 或者其他任何对象的 `Stack` 引用类型。 请注意,不能创建基本类型的堆栈:尝试创建 `Stack` 或 `Stack` 将导致编译时错误。 这是 Java 泛型类型系统的一个基本限制。 可以使用基本类型的包装类(详见第 61 条)来解决这个限制。 + +总之,泛型类型比需要在客户端代码中强制转换的类型更安全,更易于使用。 当你设计新的类型时,确保它们可以在没有这种强制转换的情况下使用。 这通常意味着使类型泛型化。 如果你有任何现有的类型,应该是泛型的但实际上却不是,那么把它们泛型化。 这使这些类型的新用户的使用更容易,而不会破坏现有的客户端(条目 26)。 \ No newline at end of file diff --git a/ch05泛型/Generics/src/main/java/com/jueee/item29/Item29Example01.java b/ch05泛型/Generics/src/main/java/com/jueee/item29/Item29Example01.java new file mode 100644 index 0000000..83f0905 --- /dev/null +++ b/ch05泛型/Generics/src/main/java/com/jueee/item29/Item29Example01.java @@ -0,0 +1,51 @@ +package com.jueee.item29; + +import java.util.Arrays; +import java.util.EmptyStackException; + +public class Item29Example01 { + + // Object-based collection - a prime candidate for generics + public class Stack { + private Object[] elements; + private int size = 0; + private static final int DEFAULT_INITIAL_CAPACITY = 16; + + public Stack() { + elements = new Object[DEFAULT_INITIAL_CAPACITY]; + } + + public void push(Object e) { + ensureCapacity(); + elements[size++] = e; + } + + public Object pop() { + if (size == 0) + throw new EmptyStackException(); + Object result = elements[--size]; + elements[size] = null; // Eliminate obsolete reference + return result; + } + + public boolean isEmpty() { + return size == 0; + } + + private void ensureCapacity() { + if (elements.length == size) + elements = Arrays.copyOf(elements, 2 * size + 1); + } + } + + public static void main(String[] args) { + Item29Example01 test = new Item29Example01(); + Stack stack = test.new Stack(); + String[] strings = new String[] {"a", "b", "c"}; + for (String arg : strings) + stack.push(arg); + while (!stack.isEmpty()) + System.out.println(stack.pop().toString().toUpperCase()); + } + +} diff --git a/ch05泛型/Generics/src/main/java/com/jueee/item29/Item29Example02.java b/ch05泛型/Generics/src/main/java/com/jueee/item29/Item29Example02.java new file mode 100644 index 0000000..a6ee340 --- /dev/null +++ b/ch05泛型/Generics/src/main/java/com/jueee/item29/Item29Example02.java @@ -0,0 +1,51 @@ +package com.jueee.item29; + +import java.util.Arrays; +import java.util.EmptyStackException; + +public class Item29Example02 { + + // Initial attempt to generify Stack - won't compile! + public class Stack { + private E[] elements; + private int size = 0; + private static final int DEFAULT_INITIAL_CAPACITY = 16; + + @SuppressWarnings("unchecked") + public Stack() { + elements = (E[])new Object[DEFAULT_INITIAL_CAPACITY]; + } + + public void push(E e) { + ensureCapacity(); + elements[size++] = e; + } + + public E pop() { + if (size == 0) + throw new EmptyStackException(); + E result = elements[--size]; + elements[size] = null; // Eliminate obsolete reference + return result; + } + + public boolean isEmpty() { + return size == 0; + } + + private void ensureCapacity() { + if (elements.length == size) + elements = Arrays.copyOf(elements, 2 * size + 1); + } + } + + public static void main(String[] args) { + Item29Example02 test = new Item29Example02(); + Stack stack = test.new Stack<>(); + String[] strings = new String[] {"a", "b", "c"}; + for (String arg : strings) + stack.push(arg); + while (!stack.isEmpty()) + System.out.println(stack.pop().toUpperCase()); + } +}