`
muzitianqing
  • 浏览: 14724 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

what is Generic type

阅读更多

泛型(Generic type 或者 generics)是对 java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象。

因为 Map.get() 被定义为返回 Object,所以一般必须将 Map.get() 的结果强制类型转换为期望的类型,如下面的代码所示:

Map m = new HashMap();m.put("key", "blarg");String s = (String) m.get("key");

要让程序通过编译,必须将 get() 的结果强制类型转换为 String,并且希望结果真的是一个 String。但是有可能某人已经在该映射中保存了不是 String 的东西,这样的话,上面的代码将会抛出 ClassCastException

理想情况下,您可能会得出这样一个观点,即 m 是一个 Map,它将 String 键映射到 String 值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。

java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。这带来了很多好处:

  • 类型安全。 泛型的主要目标是提高 java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。

java 程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String 列表或者“String String 的映射。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException 展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。

  • 消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。

尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。

该代码不使用泛型:

List li = new ArrayList();li.put(new Integer(3));Integer i = (Integer) li.get(0);

该代码使用泛型:

List li = new ArrayList();li.put(new Integer(3));Integer i = li.get(0);

在简单的程序中使用一次泛型变量不会降低罗嗦程度。但是对于多次使用泛型变量的大型程序来说,则可以累积起来降低罗嗦程度。

  • 潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。

由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

泛型用法的例子
3 页(共4 页)

泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束。考虑这个使用 Map 类的例子,其中涉及一定程度的优化,即 Map.get() 返回的结果将确实是一个 String

Map m = new HashMap();m.put("key", "blarg");String s = (String) m.get("key");

如果有人已经在映射中放置了不是 String 的其他东西,上面的代码将会抛出 ClassCastException。泛型允许您表达这样的类型约束,即 m 是一个将 String 键映射到 String 值的 Map。这可以消除代码中的强制类型转换,同时获得一个附加的类型检查层,这个检查层可以防止有人将错误类型的键或值保存在集合中。

下面的代码示例展示了 JDK 5.0 中集合框架中的 Map 接口的定义的一部分:

public interface Map { public void put(K key, V value); public V get(K key);}

注意该接口的两个附加物:

  • 类型参数 K V 在类级别的规格说明,表示在声明一个 Map 类型的变量时指定的类型的占位符。

  • get()put() 和其他方法的方法签名中使用的 K V

为了赢得使用泛型的好处,必须在定义或实例化 Map 类型的变量时为 K V 提供具体的值。以一种相对直观的方式做这件事:

Map m = new HashMap();m.put("key", "blarg");String s = m.get("key");

当使用 Map 的泛型化版本时,您不再需要将 Map.get() 的结果强制类型转换为 String,因为编译器知道 get() 将返回一个 String

在使用泛型的版本中并没有减少键盘录入;实际上,比使用强制类型转换的版本需要做更多键入。使用泛型只是带来了附加的类型安全。因为编译器知道关于您将放进 Map 中的键和值的类型的更多信息,所以类型检查从执行时挪到了编译时,这会提高可靠性并加快开发速度。

分享到:
评论

相关推荐

    Beginning Microsoft Visual CSharp 2008 Wiley Publishing(english)

    What Is a Generic? 368 Using Generics 370 Defining Generics 388 Summary 405 Exercises 405 Chapter 13: Additional OOP Techniques 408 The :: Operator and the Global Namespace ...

    ajax in prpc

    This method is a generic asynchronous request API that wraps multiple transport layers. Dojo attempts to choose the best available transport for the request at hand, and in the provided package file,...

    微软内部资料-SQL性能优化2

    Each virtual memory address is tagged as to what access mode the processor must be running in. System space can only be accessed while in kernel mode, while user space is accessible in user mode. This...

    Mastering the C++17 .pdf

    At press time, the C++17 standard is just around the corner. C++11 practically doubled the size of the standard library, adding such headers as &lt;tuple&gt; , &lt;type_traits&gt; , and &lt;regex&gt; . C++17 doubles ...

    Everyday Data Structures

    A rapid overview of data types, applications for each type, best practices and high-level variations between platforms Review the most common data structures and build working examples in the ...

    SNMP_Tag_Library-Suggested.pdf

    - **Generic Suggestions**: These take into account the public MIB information for a particular type of device, providing a general guideline for monitoring. - **Manufacturer-Specific Suggestions**: ...

    Senfore_DragDrop_v4.1

    Delphi's THandle type when a HWND is passed to a function. E.g.: if (DragDetectPlus(THandle(MyControl-&gt;Handle), Point(X, Y))) { ... } * Virtual File Stream formats can only be pasted from the ...

    Swift.3.Protocol-Oriented.Programming.2nd.Edition.epub

    What really drives Jon is the challenges the information technology field provides and there is nothing more exhilarating to him than overcoming a challenge. You can follow Jon on his two blogs: ...

    Ray Wenderlich - iOS 11 Tutorials

    - **Generic Subscripts:** This feature allows developers to access elements of a generic type using subscripts, providing greater flexibility and efficiency in code. - **Codable Protocol:** The `...

    Packt.Mastering.Csharp.and.NET.Programming

    - **Covariance in Interfaces**: Allows a type to be used where a subtype is expected. - **Covariance in Generic Types**: Explains how covariance works with generic types. - **Other Advanced Topics**...

    Java™ Puzzlers: Traps, Pitfalls, and Corner Cases.chm

    Puzzle 48: All I Get Is Static Puzzle 49: Larger Than Life Puzzle 50: Not Your Type Puzzle 51: What's the Point? Puzzle 52: Sum Fun Puzzle 53: Do Your Thing Puzzle 54: Null and Void Puzzle 55: ...

    java7帮助文档

    Type Inference for Generic Instance Creation Improved Compiler Warnings and Errors When Using Non-Reifiable Formal Parameters with Varargs Methods The try-with-resources Statement Catching Multiple...

    Exploring C++ 11

    Part 3: Generic Programming – Project3: Currency Type Part 4: Real Programming – Pointers Part 4: Real Programming – Dynamic Memory Part 4: Real Programming – Exception-Safety Part 4: Real ...

    Accelerated C++ Practical Programming by Example

    8.1 What is a generic function? 8.2 Data-structure independence 8.3 Input and output iterators 8.4 Using iterators for flexibility 8.5 Details Chapter 9 Defining new types 9.1 Student_info revisited...

    Object- Oriented Programming with Ansi-C

    is done, what its techniques are, why they help us solve bigger problems, and how we harness generality and program to catch mistakes earlier. Along the way we encounter all the jargon — classes, ...

    java.核心技术.第八版 卷1

    Volume I is designed to quickly bring you up to speed on what’s new in Java SE 6 and to help you make the transition as efficiently as possible, whether you’re upgrading from an earlier version of ...

    计算机网络第六版答案

    22. Five generic tasks are error control, flow control, segmentation and reassembly, multiplexing, and connection setup. Yes, these tasks can be duplicated at different layers. For example, error ...

    BobBuilder_app

    What is RaptorDB? Features Why another data structure? The problem with a b+tree Requirements of a good index structure The MGIndex Page Splits Interesting side effects of MGIndex The road not taken ...

    SCJP6 Sun Certificated Programmer for Java 6 Study Guide (Exam 310-065) 英文原版

    - **Encapsulation**: The practice of hiding internal details of an object and exposing only what is necessary. - **Visibility Levels**: Exploring how different access modifiers affect the visibility ...

Global site tag (gtag.js) - Google Analytics