From 1f4172cbe78fbc83f757387639b62c053b0dacf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=89=E5=8B=87=E5=BC=BA2?= Date: Fri, 20 Mar 2020 16:55:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=85=88=E8=80=83=E8=99=91=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=AE=89=E5=85=A8=E7=9A=84=E5=BC=82=E6=9E=84=E5=AE=B9?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch05泛型/33.优先考虑类型安全的异构容器.md | 8 +++++ .../java/com/jueee/item33/Item33Example01.java | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 ch05泛型/33.优先考虑类型安全的异构容器.md create mode 100644 ch05泛型/Generics/src/main/java/com/jueee/item33/Item33Example01.java diff --git a/ch05泛型/33.优先考虑类型安全的异构容器.md b/ch05泛型/33.优先考虑类型安全的异构容器.md new file mode 100644 index 0000000..d4db764 --- /dev/null +++ b/ch05泛型/33.优先考虑类型安全的异构容器.md @@ -0,0 +1,8 @@ +## 优先考虑类型安全的异构容器 + +泛型的常见用法包括集合,如 `Set 和 `Map` 和单个元素容器,如 `ThreadLocal` 和 `AtomicReference`。 在所有这些用途中,它都是参数化的容器。 这限制了每个容器只能有固定数量的类型参数。 + +**示例代码**:[Item33Example01.java](Generics/src/main/java/com/jueee/item33/Item33Example01.java):参数化键(key)而不是容器。 然后将参数化的键提交给容器以插入或检索值。 泛型类型系统用于保证值的类型与其键一致。 + +`Favorites` 实例是类型安全的:当你请求一个字符串时它永远不会返回一个整数。 它也是异构的:与普通 Map 不同,所有的键都是不同的类型。我们将 `Favorites` 称为类型安全异构容器(`typesafe heterogeneous container`)。 + diff --git a/ch05泛型/Generics/src/main/java/com/jueee/item33/Item33Example01.java b/ch05泛型/Generics/src/main/java/com/jueee/item33/Item33Example01.java new file mode 100644 index 0000000..e5d8b9b --- /dev/null +++ b/ch05泛型/Generics/src/main/java/com/jueee/item33/Item33Example01.java @@ -0,0 +1,34 @@ +package com.jueee.item33; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class Item33Example01 { + + // Typesafe heterogeneous container pattern - client + public static void main(String[] args) { + Favorites f = new Favorites(); + f.putFavorite(String.class, "Java"); + f.putFavorite(Integer.class, 0xcafebabe); + f.putFavorite(Class.class, Favorites.class); + + String favoriteString = f.getFavorite(String.class); + int favoriteInteger = f.getFavorite(Integer.class); + Class favoriteClass = f.getFavorite(Class.class); + System.out.printf("%s %x %s%n", favoriteString, favoriteInteger, favoriteClass.getName()); + } + +} + +class Favorites { + private Map, Object> favorites = new HashMap<>(); + + public void putFavorite(Class type, T instance) { + favorites.put(Objects.requireNonNull(type), instance); + } + + public T getFavorite(Class type) { + return type.cast(favorites.get(type)); + } +} \ No newline at end of file