第23条:请不要在新代码中使用原生态类型:
Set<Object>是个参数化类型,表示可以包含任何对象的一个集合;Set<?>则是一个通配符类型,表示只能包含某种未知对象类型的一个集合,既不能从里面拿到一个元素去赋值,也不能增加一个元素,可以删除。
第24条:消除泛型的非受检警告 unchecked warning:
如果无法消除警告,同时可以证明引起警告的代码是类型安全的,才可以用@SuppressWarning("unchecked")注解来消除这条警告。同时用注释把禁止该警告的原因记录下来。
第25条:列表优于数组:
数组是协变的covariant,其实就是表示如果Sub为Super的子类型,则Sub[]就是Super[]的子类型,而泛型不同。所以创建泛型数组或者参数化数组都是不合法的,编译不通过。
为了说明为什么不可行,一个经典例子:
List<String>[] stringLists = new List<String>[1]; List<Integer> intList = Arrays.asList(42); Object[] objects = stringLists; object[0] = intList; String s = stringLists[0].get(0);
假设第一行是合法的,那么运行时会抛出ClassCastException。
第26条:优先考虑泛型:
第27条:优先考虑泛型方法:
public class RecursiveTypeBound { // Returns the maximum value in a list - uses recursive type bound public static <T extends Comparable<T>> T max(List<T> list) { Iterator<T> i = list.iterator(); T result = i.next(); while (i.hasNext()) { T t = i.next(); if (t.compareTo(result) > 0) result = t; } return result; } public static void main(String[] args) { List<String> argList = Arrays.asList(args); System.out.println(max(argList)); } }
第28条:利用有限制通配符提升API的灵活性:
extends和super通配符使用规则:
在表示生产者的输入参数上使用extends。
而消费者输入参数上使用super
producer-extends,consumer-super
不要用通配符作为返回类型。
public class Union { public static <E> Set<E> union(Set<? extends E> s1, Set<? extends E> s2) { Set<E> result = new HashSet<E>(s1); result.addAll(s2); return result; } // Simple program to exercise flexible generic method public static void main(String[] args) { Set<Integer> integers = new HashSet<Integer>(); integers.add(1); integers.add(3); integers.add(5); Set<Double> doubles = new HashSet<Double>(); doubles.add(2.0); doubles.add(4.0); doubles.add(6.0); // Won't compile; see page 137 // Set<Number> numbers = union(integers, doubles); // Explicit type parameter is necessary here Set<Number> numbers = Union.<Number> union(integers, doubles); System.out.println(numbers); } }
public class Swap { public static void swap(List<?> list, int i, int j) { swapHelper(list, i, j); } // Private helper method for wildcard capture private static <E> void swapHelper(List<E> list, int i, int j) { list.set(i, list.set(j, list.get(i))); } public static void main(String[] args) { // Swap the first and last argument and print the resulting list List<String> argList = Arrays.asList(args); swap(argList, 0, argList.size() - 1); System.out.println(argList); } }
第29条:优先考虑类型安全的异构容器:
public class Favorites { // Typesafe heterogeneous container pattern - implementation private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>(); public <T> void putFavorite(Class<T> type, T instance) { if (type == null) throw new NullPointerException("Type is null"); favorites.put(type, instance); } public <T> T getFavorite(Class<T> type) { return type.cast(favorites.get(type)); } // 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()); } }
本人博客已搬家,新地址为:http://yidao620c.github.io/
相关推荐
"Effective Java 读书分享" 《Effective Java》读书分享.pptx 是一本 Java 编程语言指南,旨在帮助开发者编写高质量、可维护的 Java 代码。该书包含 90 个条目,每个条目讨论一条规则,涵盖了 Java 编程语言的...
《Effective Java》是Java开发领域的经典著作,作者...以上仅是《Effective Java》的部分内容,书中还有更多关于枚举、泛型、集合、多线程等方面的重要指导,都是Java开发者提升代码质量、遵循良好编程习惯的宝贵资源。
- 类型擦除:解释了Java泛型的本质,即编译后的类型参数会被替换为通配符或Object。 - 通配符:详细介绍了上界通配符,下界通配符和的用法。 - 类型参数的边界:讲解了如何定义有界的类型参数,如,以限制参数...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,中文版第二版更是深受广大Java开发者喜爱。这本书提供了许多实用的编程实践和经验教训,帮助开发者编写出更高效、可维护的Java代码。这里我们将...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,第二版更是程序员们不可或缺的参考书籍。这本书深入探讨了如何编写出高质量、高效、可维护的Java代码,涵盖了众多最佳实践和设计模式。这里我们将...
5. **泛型(Generics)**: 书中深入讲解了Java泛型的用法,包括类型擦除、类型参数化、通配符、边界等,代码示例可以帮助理解这些概念。 6. **重写equals()和hashCode()方法(Overriding equals() and hashCode())...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,现在已经更新到第三版。这本书深入探讨了如何编写高效、可维护且设计良好的Java代码,是每一个Java开发者提升技能的重要参考资料。以下是对该...
《Effective Java》是Java开发领域的一本经典著作,由知名程序员Joshua Bloch撰写。这本书深入探讨了如何编写高效、可维护的Java代码,并提出了许多实用的编程实践和设计原则。通过对书中源代码的分析,我们可以更...
Java泛型简明教程 泛型是Java SE 5.0中引入的一项特征,自从这项语言特征出现多年来,我相信,几乎所有的Java程序员不仅听说过,而且使用过它。关于Java泛型的教程,免费的,不免费的,有很多。我遇到的最好的教材有...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。这本书分为多个条目,每个条目都深入探讨了一个特定的Java编程实践...
2. **避免使用原始类型(Avoid Raw Types)**:Java泛型引入后,使用泛型可以提高类型安全,避免在运行时出现ClassCastException。避免在编写新代码时使用原始类型,如List而非List。 3. **总是重写equals()和...
《Effective Java》是Java开发领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。在IntelliJ IDEA这样的集成开发环境中,我们可以利用特定的插件来...
《EffectiveJava》是Java开发领域的经典著作,由Joshua Bloch撰写,提供了许多关于如何编写高效、可维护和设计良好的Java代码的实用建议。这本书的第2版在原有的基础上进行了更新,以适应Java语言的新发展。现在,...
《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,第二版发布于2008年。这本书旨在提供实用的编程指导,帮助开发者写出更高效、更可维护的Java代码。以下是对书中核心知识点的详细解读: 1. *...
《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,中文版第三版的出版为Java开发者提供了深入理解语言特性和最佳实践的机会。这本书包含了一系列编程实践和设计模式,旨在帮助程序员写出更高效、更...
Java是全球最流行的编程语言之一,尤其在企业级应用开发领域有着广泛的运用。"Java四大名著"是Java开发者心中的经典读物,它们为初学者提供了深入理解Java语言和技术体系的宝贵资源。以下是对这些书籍内容的详细概述...