`
yaojinglive
  • 浏览: 7353 次
  • 性别: Icon_minigender_2
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java—泛型

 
阅读更多

泛型

概念

泛型实现了参数化类型的概念,使代码可以运用于多种类型。泛型正如其名他是一种方法,通过它可以编写出更“泛化”的代码,这些代码对于它们能够作用的类型具有更少的限制,因此单个的代码段可以应用到更多的类型上。所以泛型的通用语言特性的目的在于表达性而不仅仅是为了创建类型安全的容器。

 

简单泛型

泛型出现的最引人注意的一个原因就是为了创造容器类。泛型最主要的目的就是用来指定容器要持有什么类型的对象。如:

public Class Test<T>{

private T a;

public Test(T a){

this.a =a;

}

public void set(T a){

this.a =a;

}

public T get(){

return a;

}

}

 

一个元组类库

概念:将一组对象直接打包存储于其中的一个单一对象。这个容器对象允许读取其中元素,但是不允许想其中存放新的对象。也可以称为数据传送对象或信使。

public Class TwoTuple<A,B>{

public final A first;

public final B second;

public TwoTuple(A a,B b){

first = a;second=b;

}

public String toString(){

return "("+first+","+second+")";

}

}

 

泛型接口

泛型也可以应用于接口。例如生成器(generator),这是一种专门负责创建对象的类。这是工厂发放设计模式的一种应用。

基本类型无法作为类型参数。但是java SE5 具备了自动打包的功能。

 

泛型方法

泛型方法可以使得该方法能够独立于类儿发生变化。泛型的基本指导原则:无论何时,只要你能做到,你就应该只使用泛型方法。这样可以是事情更清楚明白。

public Class GenericMethods{

public <T> void f(T x){

        system.out.println(x.getClass().getName());

}

}

 

泛型的擦除

在泛型代码的内部,无法获得任何有关泛型参数类型的信息

Java的泛型是使用擦除来实现的,这意味着当你在使用泛型时,任何具体的类型都会被擦除了,你唯一知道的就是你在使用一个对象。因此List<String>与List<Integer>在运行时事实上是相同的类型。他们都被擦除成“原生”类型List。

 

擦除的核心动机是使得泛化的客户端可以用非泛化的类库来使用,反之亦然,这经常被称之为“迁移兼容性”;擦除的代价使得泛型不能用于显示的引用运行时类型的操作之中,例如转型instanceof操作和new表达式。因为所有参数的类型信息都丢失了。

 

擦除的补偿

引入类型标签,就可以转而使用动态的isInstance();

public class ClassType<T>{

Class<T> kind;

 public ClassType(Class<T> kind){

     this.kind = kind;

}

  public boolean f(Object arg){

     return kind.isInstance(arg);

}

 }

 边界

    使得你可以在用于泛型的参数类型上设置限制条件尽管这是的你可以强制规定泛型可以应用的类型,但是其潜在的一个更重要的效果是你可以按照自己的边界类型来调用方法。

Class Colored<T extend HashColor>{} 

    通配符被限制为单一边界。

 

通配符

List<? extends Fruit> first通配符引用的是明确的类型,因此他意味着“某种first引用没有指定的具体类型”

 

逆变

List<? super MyClass> 添加MyClass或者其子类

 

无界通配符 <?>可以被认为是一种装饰,可以理解为要写一个泛型的程序

 

泛型的注意事项

1)任何基本类型都不能作为类型参数

2)一个类不能实现同一个泛型接口的两种变体,由于擦除的原因这两个变体会成为相同的接口。

3)带有泛型类型参数的转型或instanceof不会有任何效果

4)下面的程序不能被编译,由于擦除的原因,重载方法将产生相同的类型签名

public class UseList<W,T>{

public void f<W>{};

public void t<T>{};

}

5)基类劫持了接口

 

自限定类型

class SelfBounded<T extends SelfBounded<T>>

1)循环泛型,基类用导出类代替其参数

Class GenericType<T>{...}

 

Class CuriouslyRecurringGeneric extends GenericType<CuriouslyRecurringGeneric>{...}

 

2)自限定

 

3)参数协变

自限定类型的价值在于他们可以产生协变参数类型—方法参数类型会随子类发生变化。

 

 

动态类型安全

java.util.Collections中有一组便利工具,可以解决在这种情况下的类型检查问题,它们是:静态方法checkedCollection()、checkedList()、checkedMap()、checkedSet()、checkedSortedMap()、checkedSortedSet().

这些方法每一个都会将你希望动态检查的容器当做第一个检查参数接受,并将你希望强制要求的类型作为第二个参数接受。

 

异常

catch语句不能捕获放心类型的异常,因为在编译器和运行时都必须知道异常的确切类型。泛型类也不能直接或者简介继承自Throwable。但是类型参数可能会在一个方法的throws自居中用到。

 

混型

。。。。

 

 

 

 

分享到:
评论

相关推荐

    Java泛型编程指南.pdf

    ### Java泛型编程指南知识点详解 #### 一、绪论:理解Java泛型的重要性与背景 **1.1 泛型的基本概念** 泛型是一种在编程语言中支持编写类型安全的通用函数或类的能力。在Java中引入泛型的主要目的是为了提供更...

    Java泛型的用法及T.class的获取过程解析

    Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    Java 泛型详解 Java 泛型是 Java SE 5.0 中引入的一项特征,它允许程序员在编译时检查类型安全,从而减少了 runtime 错误的可能性。泛型的主要优点是可以Reusable Code,让程序员编写更加灵活和可维护的代码。 ...

    Java泛型应用实例

    Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...

    很好的Java泛型的总结

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

    java 泛型类的类型识别示例

    综上所述,虽然Java泛型在编译后会进行类型擦除,但通过上述技巧,我们仍然能够在运行时获得关于泛型类实例化类型的一些信息。在实际开发中,这些方法可以帮助我们编写更加灵活和安全的代码。在示例文件`GenericRTTI...

    java泛型技术之发展

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...

    SUN公司Java泛型编程文档

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入。这个特性极大地提高了代码的类型安全性和可读性,减少了在运行时出现ClassCastException的可能性。SUN公司的Java泛型编程文档,包括...

    java 泛型接口示例

    下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`&lt;T&gt;`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...

    java 泛型方法使用示例

    下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...

    Java 泛型擦除后的三种补救方法

    Java 泛型是一种强大的工具,它允许我们在编程时指定变量的类型,提供了编译时的类型安全。然而,Java 的泛型在运行时是被擦除的,这意味着在运行时刻,所有的泛型类型信息都会丢失,无法直接用来创建对象或进行类型...

    java泛型的内部原理及更深应用

    Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...

    JAVA泛型加减乘除

    这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...

    java泛型总结

    ### Java泛型总结 #### 一、Java泛型概述 Java泛型是在JDK5之后引入的一个特性,它提供了一种类型安全的机制,用于指定集合或其他数据结构中的元素类型。通过使用泛型,程序员可以在编译阶段检测类型错误,避免了...

    java泛型学习ppt

    "Java 泛型学习" Java 泛型是 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的...

    Java泛型使用详细分析.pdf

    Java 泛型使用详细分析 Java 泛型是 Java 语言中的一种类型系统特性,允许开发者在编译期检查类型安全,以避免在运行时出现类型相关的错误。在本文中,我们将详细介绍 Java 泛型的使用方法和实现原理。 一、泛型的...

    Java泛型技术之发展.pdf

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...

    Java泛型类型擦除后的补偿

    本文将深入探讨Java泛型类型擦除的概念,并介绍在类型擦除后,为了保持泛型的安全性和便利性,Java设计者所采取的一些补偿机制。 1. **类型擦除**: - 在编译期间,所有的泛型类型信息都会被替换为它们的实际类型...

Global site tag (gtag.js) - Google Analytics