`
jimode2013
  • 浏览: 39362 次
社区版块
存档分类
最新评论

Thinking in java——Generics 产生检查类型的容器类

 
阅读更多

Dynamic type safety

Because you can pass generic containers to pre-Java SE5 code, there's still the possibility that old-style code can corrupt your containers. Java SE5 has a set of utilities in java.util.Collections to solve the type-checking problem in this situation: the static methods checkedCollection( ), checkedList( ),checkedMap( ), checkedSet( ), checkedSortedMap( ) and checkedSortedSet( ). Each of these takes the container you want to dynamically check as the first argument and the type that you want to enforce as the second argument. 

A checked container will throw a ClassCastException at the point you try to insert an improper object, as opposed to a pre-generic (raw) container which would inform you that there was a problem when you pulled the object out. In the latter case, you know there's a problem but you don't know who the culprit is, but with checked containers you find out who tried to insert the bad object. 

Let's look at the problem of "putting a cat in a list of dogs" using a checked container. Here,oldStyleMethod( ) represents legacy code because it takes a raw List, and the @SuppressWarnings("unchecked" ) annotation is necessary to suppress the resulting warning: 

//: generics/CheckedList.java
// Using Collection.checkedList().
import typeinfo.pets.Cat;
import typeinfo.pets.Dog;
import typeinfo.pets.Pet;

import java.util.*;

public class CheckedList {
  @SuppressWarnings("unchecked")
  static void oldStyleMethod(List probablyDogs) {
    probablyDogs.add(new Cat());
  }	
  public static void main(String[] args) {
    List<Dog> dogs1 = new ArrayList<Dog>();
    oldStyleMethod(dogs1); // Quietly accepts a Cat
    List<Dog> dogs2 = Collections.checkedList(
      new ArrayList<Dog>(), Dog.class);
    try {
      oldStyleMethod(dogs2); // Throws an exception
    } catch(Exception e) {
      System.out.println(e);
    }
    // Derived types work fine:
    List<Pet> pets = Collections.checkedList(
      new ArrayList<Pet>(), Pet.class);
    pets.add(new Dog());
    pets.add(new Cat());
  }
} /* Output:
java.lang.ClassCastException: Attempt to insert class typeinfo.pets.Cat element into collection with element type class typeinfo.pets.Dog
*///:~

When you run the program you'll see that the insertion of a Cat goes unchallenged by dogsi , but dogs2 immediately throws an exception upon the insertion of an incorrect type. You can also see that it's fine to put derived-type objects into a checked container that is checking for the base type. 

 

分享到:
评论

相关推荐

    Thinking in Java 4th Edition + Annotated Solution Guide (代码)英文文字版 带书签 有答案

    《Thinking in Java》是Bruce Eckel的经典之作,第四版涵盖了Java编程语言的广泛主题,适合初学者和有经验的程序员。这本书深入浅出地讲解了Java的核心概念和技术,旨在帮助读者建立坚实的编程基础,并理解面向对象...

    Thinking in Java中文版(3和4)

    7. **反射(Reflection)**:讲解了如何在运行时检查类、接口、方法和字段,以及动态调用方法和创建对象,这是Java灵活性的一个重要体现。 8. **泛型**:自Java 5引入,泛型提供了一种类型安全机制,使得容器可以...

    Thinking in Java 课文中的代码

    - 类(class)和对象(object):Java是一种面向对象的语言,`Thinking in Java`会详细介绍如何定义类,创建对象以及对象间的交互。 - 继承(inheritance)和多态(polymorphism):书中将展示如何通过继承实现代码重用,...

    Thinking in java 22

    很抱歉,但根据您给出的信息,这似乎是一个音乐文件列表,而非与"Thinking in Java"相关的IT知识内容。"Thinking in Java"是一本著名的编程书籍,通常与Java编程语言的学习和实践相关。如果您的目标是获取这方面的...

    Thinking in Java 3th and 4th Edition+代码+答案

    《Thinking in Java》是Bruce Eckel的经典编程教材,它涵盖了Java语言的核心概念和技术,深受程序员和初学者喜爱。这本书分为第三版和第四版,每个版本都有其独特的知识点和更新内容。 第三版是针对Java 2 Platform...

    Thinking in Java英文版.rar

    《Thinking in Java》会详细解释如何使用这些集合以及迭代器(Iterator)和泛型(Generics)的概念,这些对于编写高效且可维护的代码至关重要。 多线程是并发编程的基础,Java提供了强大的支持。书中会讨论线程的...

    Thinking in Java(英文原版第4版)

    《Thinking in Java(英文原版第4版)》作为一本经典Java编程思想书籍,其内容涵盖了面向对象的叙述方式,并针对Java SE5/6版本新增了示例和章节。本书适合作为初学者的入门教材,同时也包含了足够的深度,适合专业...

    Generics_in_the_Java_Programming_Language译文

    Java 中的泛型是 Java 5(JDK 1.5)中引入的一项新特性,旨在解决类型安全和代码重用的问题。泛型允许程序员对类型进行抽象,使得代码更加灵活和可维护。 泛型的优点: 1. 类型安全:泛型可以在编译期检查类型的...

    Thinking in java 4th eidtion

    - 泛型(Generics):使编译器能够检查类型安全,并在编译时消除强制类型转换的需要。 - 集合框架(Collection Framework):包括List、Set、Map等接口以及其实现类,如ArrayList、LinkedList、HashSet、HashMap等...

    Thinking in Java 4th 习题答案

    《Thinking in Java 4th 习题答案》涵盖了多个关键的Java编程概念和技术,包括深入的容器理解、输入/输出(I/O)处理、枚举类型(Enumerated Types)、注解(Annotations)以及并发编程(Concurrency)。这些章节是Java学习...

    Thinking in Java 4th Edition with Annotated Solution Guide编程思想+课后习题源码

    3. ** Generics**:Java泛型是Java 5引入的新特性,用于提供类型安全,允许在编译时检查类型。泛型可以减少运行时错误,提高代码的可读性和重用性。书中会讲解泛型类、泛型方法、通配符以及类型擦除等概念。 4. **...

    Thinking In Java 第四版

    《Thinking in Java》是Bruce Eckel的经典之作,第四版更是深受全球Java开发者喜爱的教材。这本书深入浅出地讲解了Java编程语言的核心概念和技术,旨在为初学者提供全面且深入的Java学习指导。 首先,书中的第一章...

    Thinking in Java第三版+第四版(中文版+习题答案)

    《Thinking in Java》是Java编程领域的一本经典之作,由Bruce Eckel撰写,深受程序员喜爱。这本书深入浅出地介绍了Java语言的核心概念和技术,旨在帮助读者建立起坚实的基础,并提升编程思维能力。书中不仅包含了...

    [Java泛型和集合].(Java.Generics.and.Collections).文字版

    **Java泛型** 是自Java 5引入的一种机制,它允许在类、接口和方法声明中使用类型参数,以实现更强大的类型检查和更少的类型转换。泛型的主要优点包括: 1. **类型安全**:编译时可以检查错误,避免了运行时...

    Java Generics FAQ

    Java泛型(Generics)是Java SE 5.0引入的一种新特性,它允许程序员在编译时检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。下面将根据给定的文件信息,深入解析Java泛型的一些核心知识点...

    Thinking In Java 练习题答案 第四版

    《Thinking In Java》是Bruce Eckel的经典之作,它深入浅出地介绍了Java编程语言的核心概念和技术,被广大程序员视为学习Java的权威指南。第四版更是加入了更多现代Java特性,如Generics、Annotations等,使读者能够...

Global site tag (gtag.js) - Google Analytics