`

读书笔记--Effective Java 2nd -- 第五章 泛型

    博客分类:
  • java
 
阅读更多

23 条:不要在新代码中使用原生态类型

         Java 1.5 加入了泛型,即类型参数,在 1.5 之前可以将任意对象放入集合中,所以在从集合中取出来的时候都需要做强制类型转换,这就有可能导致 ClassCastException 1.5 加入泛型后,就得到了在编译期间检查的好处了。虽然在运行时泛型会做擦除,泛型的目的应该还是减少 ClassCastException 和一些表述上的优势。比如 List<Date> 就是存放 Date 的一个 list ,而在 1.5 以前就是一个 List ,可以放任何东西,只能程序员自己控制。

         所以能不使用 rawtype 就别使用,有些地方你可能不知道该使用什么类型参数,这时应该使用通配符 <?>.

         但是在类文字中必须使用 Raw type, 比如 List.class,String.class List<String>.class 是不合法的。

24 条:消除非受检警告

         尽量消除非受检警告,没有非受检警告意味着不会出现 classCastException 。如果无法消除,但是又确定类型安全的时候可以用 SuppressWarning(“unchecked”) 注解来消除,当然在该用的地方用这个注解。

25 条:列表优先于数组

         由于数组是协变的,如下 :

                   Object[]  ob = new Long[1];

                   ob[0] = "abc";

         这样在编译期间不会有任何错误,但是在运行时马上就会抛出 ArrayStoreException

而如果你试图将一个 String 类型放入 List<Long> 中编译将不会通过。由于数组是协变的,所以数组是不能够泛型化的。

         总的来说就是除非必要,都应该优先考虑用列表而不是数组。

26 : 优先考虑泛型

         尽可能的将一些可能持有对象的类编写为泛型,避免在使用这些类的时候做类型转换。

27 条:优先考虑泛型方法

         应该尽量确保调用方法时不需要做类型转换,所以尽量将方法泛型化。

28 : 利用有限制通配符来提升 API 的灵活性

         有限制通配符是指 ? extends E,? super E. 第一个是指任何 E 的子类,第二个指任何 E 的父类。什么时候用哪个呢,有个助记符可以让你记住 PECS – producer extends consumer super.

利用这条原则来编写有限制的通配符。所有的 comparator comparable 都是 consumer ,在有 Comparable<T> 时都可以考虑 Comparable<? super T>.

29 条:优先考虑异构安全的类型容器

         jdk 里面的容器在有类型参数的情况下指允许放入参数类型的实例,但你可以编写一个以 Class<T> key value 为该 class 对应实例的类来存放不同类型的实例,这个就是异构。

如下示例代码:

package com.andyjiang.generic;

public interface Favorites {
	public <T> void putFavorite(Class<T> clazz,T instance);
	public <T> T getFavorte(Class<T> clazz);
}
 
package com.andyjiang.generic.impl;

import java.util.HashMap;
import java.util.Map;

import com.andyjiang.generic.Favorites;

public class FavoritesImpl implements Favorites {
	
	private Map<Class<?>,Object> favoriteMap = new HashMap<Class<?>,Object>();

	public <T> void putFavorite(Class<T> clazz, T instance) {
		this.favoriteMap.put(clazz, instance);
	}

	public <T> T getFavorte(Class<T> clazz) {
		// TODO Auto-generated method stub
		return clazz.cast(this.favoriteMap.get(clazz));
	}

}
分享到:
评论

相关推荐

    Java 第二阶段提升编程能力【泛型】---- 代码

    Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...

    日常笔记-JAVA泛型

    日常笔记-JAVA泛型

    JAVA-泛型课件-泛型课件

    泛型是Java语言的一个重要特性,首次出现在Java SE 1.5版本中。它的引入主要是为了解决在集合操作中类型安全性的问题,并通过引入参数化类型的概念,提高了代码的复用性与可读性。 ### 泛型概念 泛型,即参数化...

    java笔记.zip

    、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 2020-4-8 java笔记 String类 2020-4-9 java 比较器 2020-4-10 java笔记 枚举类 2020-4-10 java 注解...

    很好的Java泛型的总结

    Java泛型机制详解 Java泛型是Java语言中的一种机制,用于在编译期检查类型安全。Java泛型的出现解决了Java早期版本中类型安全检查的缺陷。Java泛型的好处是可以在编译期检查类型安全,避免了运行时的...

    Generic_2(泛型类-泛型方法-泛型接口-泛型限定(上限)

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...

    29-API-集合框架-泛型-使用_java_

    Java 泛型是Java编程语言中的一个重要特性,它在2004年随着Java SE 5.0的发布被引入。泛型的主要目的是提供类型安全,同时减少在编译时和运行时出现的类型转换错误。它允许程序员在定义类、接口和方法时指定参数类型...

    java-泛型-面试题.docx

    java-泛型-面试题.docx

    SSH笔记-泛型依赖注入

    泛型是Java SE 5引入的一种强大的类型系统机制,允许在类、接口和方法中使用类型参数,从而增强了代码的类型安全性和重用性。在Spring框架中,泛型主要应用于依赖注入(Dependency Injection,简称DI),这是Spring...

    全面总结Java泛型--实例

    Java泛型是在JDK 5中引入的一种新特性,用于创建参数化类型,也就是说,可以在类、接口和方法中定义类型参数。泛型提供了类型安全的集合以及避免了显式类型转换的需要。使用泛型可以实现类型安全的数据结构,如List...

    补充知识:泛型1---马克-to-win java视频

    补充知识:泛型1---马克-to-win java视频的详细描述与介绍

    补充知识:泛型2---马克-to-win java视频

    补充知识2 ---马克-to-win java视频泛型的详细描述与介绍

    关于java基础的泛型的练习

    Java泛型是Java SE 5.0引入的一个重要特性,它极大地增强了代码的类型安全性和可读性。泛型在编程中的应用广泛,特别是在集合框架中,使得我们可以在编译时就检查类型,避免了不必要的类型转换,并且提高了代码的...

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者...以上仅是《Effective Java》的部分内容,书中还有更多关于枚举、泛型、集合、多线程等方面的重要指导,都是Java开发者提升代码质量、遵循良好编程习惯的宝贵资源。

    Java泛型研究.pdf

    Java泛型是Java语言中的一种重要机制,自从Java 1.5版本引入泛型以来,Java开发者可以更方便地编写类型安全的代码。泛型的引入解决了Java早期版本中类型不安全的问题,提高了Java语言的开发效率和安全性。 泛型的...

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    java学习笔记-----给java初学者

    学习Java的第一步是安装Java Development Kit (JDK),它包含了编译、调试和运行Java程序所需的所有工具,如javac编译器和Java虚拟机(JVM)。 3. **基本语法** - **变量与数据类型**:Java有八种基本数据类型,...

Global site tag (gtag.js) - Google Analytics