`
yiminghe
  • 浏览: 1465620 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java Generic (泛型) 笔记

    博客分类:
  • java
阅读更多

IBM DeveloperWorks

 

由一点问题出错提醒

 

public class X {
	void set(ArrayList<String> y) {
	}
	
	void set(ArrayList<Integer> y) {
	}
}

 

才理解这就是所谓  type erasure (类型擦除)   ,ArrayList<String>,ArrayList<Integer> 在 字节码文件 (1.5 会在签名部分有不同,可以反射获取泛型具体类型,但jvm运行没影响),jvm中都是同一类型。

 


1. 不同于 c++ 中的 template ,生成多个类 ,java 中仍是一个类 ,只不过生成字节码文件,替换 参数类型为指定上限(默认为Object),编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除, Java 语言中的泛型不能接受基本类型作为类型参数――它只能接受引用类型。


2. 所以 在 泛型类中 , 调用 参数类型相关的操作没有意义 (运行时已被擦为 上限), 不能调用  instanceof T and new T ( new 只能通过插入class然后反射来实现 ). 类型参数的作用域是定义这个类型参数的整个类,但是不包括静态成员函数。这是因为当访问同一个静态成员函数时,同一个类的不同实例可能有不同的类型参数,所以上述提到的那个作用域不应该包括这些静态函数,否则就会引起混乱。


3.泛型不具有协变性 ,X<Number>  x<Integer> 没有上下级关系,协变性不能通过

 

import java.util.ArrayList;

public class template {

	public static void main(String[] args) {
		C<Number> x=new C<Number>();
		C<Integer> y=new C<Integer>();
		//error
		x.get(y);
	}

}

class C<T> {
	  public void get(C<T> t){
		 
	  }
	  
	}


3.1 可以通过有界通配符实现

 

import java.util.ArrayList;

public class template {

	public static void main(String[] args) {
		C<Number> x=new C<Number>();
		C<Integer> y=new C<Integer>();
		x.get(y);
	}

}

class C<T> {
	  public void get(C<? extends T> t){
		 
	  }
	  
	}

 

有界通配符最适合用于 API,而不是客户机代码。


仅从某个结构中获取值时使用 extends 通配符;仅将值放入某个结构时使用 super 通配符;同时执行以上两种操作时不要使用通配符。


通配符不能出现在 class C<? extends x> 中 ,类需要确切类型参数名字,class C<T extends X> 使得 可以在类中调用 属于 X 的方法。

 

class C<T extends Number> {
	  public void get(C<? extends T> t){
		 
	  }
	  
	  public void get2(T t){
			 t.byteValue();
	  }	  


	}
 

 

 

3.2 或者受限类型参数:

 

import java.util.ArrayList;

public class template {

	public static void main(String[] args) {
		C<Number> x=new C<Number>();
		C<Integer> y=new C<Integer>();
		x.get(y);
	}

}

class C<T> {
	  public  <X extends T> void  get(C<X> t){
		 
	  }
	  
	 
	  
	}

 

 


 

 

 

特点:(From 多角度看 Java 中的泛型

 

    * 类型安全。 泛型的一个主要目标就是提高 Java 程序的类型安全。使用泛型可以使编译器知道变量的类型限制,进而可以在更高程度上验证类型假设。如果没有泛型,那么类型的安全性主要由程序员来把握,这显然不如带有泛型的程序安全性高。


    * 消除强制类型转换。泛型可以消除源代码中的许多强制类型转换,这样可以使代码更加可读,并减少出错的机会。


    * 向后兼容。支持泛型的 Java 编译器(例如 JDK5.0 中的 Javac)可以用来编译经过泛型扩充的 Java 程序(GJ 程序),但是现有的没有使用泛型扩充的 Java 程序仍然可以用这些编译器来编译。


    * 层次清晰,恪守规范。无论被编译的源程序是否使用泛型扩充,编译生成的字节码均可被虚拟机接受并执行。也就是说不管编译器的输入是 GJ 程序,还是一般的 Java 程序,经过编译后的字节码都严格遵循《Java 虚拟机规范》中对字节码的要求。可见,泛型主要是在编译器层面实现的,它对于 Java 虚拟机是透明的。


    * 性能收益。目前来讲,用 GJ 编写的代码和一般的 Java 代码在效率上是非常接近的。 但是由于泛型会给 Java 编译器和虚拟机带来更多的类型信息,因此利用这些信息对 Java 程序做进一步优化将成为可能。

 


总之:为了避免JVM大的变动,java选择了在字节码级别保持向后兼容,而编译器则仅仅负责了检查以及自动添加强制转换代码来生成能兼容以前jvm的设计。

 

参考:

 

JAVA 范型学习


 

 

 

 

 

分享到:
评论

相关推荐

    JAVA泛型笔记.pdf

    "JAVA泛型笔记.pdf" Java 泛型(Generic)是 Java 5 中引入的一种机制,它允许开发者在编写类、接口和方法时指定类型参数,以提高代码的灵活性和可重用性。泛型的主要特点是可以在编译期检查类型的正确性,避免了...

    集合框架学习笔记

    这篇学习笔记将深入探讨Java集合框架的基础概念、主要类库以及常见应用场景。 首先,Java集合框架分为两种基本类型:List(列表)和Set(集)。List接口代表有序的集合,允许重复元素,如ArrayList和LinkedList;而...

    韩顺平 java基础加强笔记整理

    - 类声明泛型:`public class GenericClass&lt;T&gt; { ... }` 以上是关于 Eclipse 常用快捷键、可变参数、枚举、反射、泛型等内容的知识点总结,这些知识点对于初学者掌握 Java 开发的基本技能非常重要。

    java基础知识笔记总结

    ### Java基础知识笔记总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是通过特定的计算机语言来编写指令,让计算机能够执行一系列任务的过程。 2. **Java语言概述,历史、特点** - Java是由Sun ...

    20-Spring-Java学习笔记脱水版1

    - **泛型(Generic)**:泛型增加了代码的类型安全性,防止在集合中插入不兼容的数据类型。 - **排序和比较**:Java.util.Collections提供了排序方法,而Comparable和Comparator接口用于定制比较逻辑。 - **异常...

    良葛格Java JDK 5.0学习笔记

    本学习笔记将聚焦于JDK 5.0的关键更新,旨在帮助开发者理解和掌握这个里程碑式的Java版本。 1. **类型注解 (Type Annotations)** JDK 5.0引入了泛型,允许在类、接口和方法声明中使用类型参数,提高了代码的类型...

    Java JDK 6学习笔记——ppt简体版

    - **泛型的类型推断(Type Inference for Generic Instance Creation)**:简化了泛型的使用,允许在创建对象时省略类型参数,如`List&lt;String&gt; list = new ArrayList();` - **枚举注解(Enums in Switch ...

    Java+JDK+7学习笔记(国内第一本Java+7,前期版本累计销量5万册)源码整理

    本学习笔记聚焦于这一关键版本,旨在帮助读者深入理解和掌握Java 7的核心技术。下面将详细阐述Java JDK 7中的关键知识点。 1. **自动资源管理 (try-with-resources)** Java 7引入了try-with-resources语句,使得...

    整理后java开发全套达内学习笔记(含练习)

    Generic [java] 泛型 [dʒi'nerik] goto (保留字) 跳转 heap n.堆 [hi:p] implements (关键字) 实现 ['implimәnt] import (关键字) 引入(进口,输入) Info n.信息 (information [,infә'meiʃәn] ) ...

    Java SE 7 Documentation

    2. **类型推断**:Java 7引入了类型推断(Type Inference for Generic Instance Creation),使得泛型实例化更加简洁,如`List&lt;String&gt; list = new ArrayList();`。 3. **多路复用I/O**(NIO.2):NIO(New I/O)在...

    Java+JDK+7 Learning notes.zip_java_jdk

    7. Type Inference for Generic Instance Creation:通过“钻石操作符”简化泛型实例化。 三、Java内存模型与垃圾回收 理解Java内存模型,包括堆内存、栈内存、方法区(元空间)以及程序计数器等,以及它们在JVM中...

    传智播客 方立勋 javaweb 完全笔记

    **7.9 泛型(Generic)** - **目的**: 在编译时检查类型安全,并允许创建高度可复用的组件。 - **类型**: - 泛型类 - 泛型方法 - 通配符 **7.10 泛型典型应用** - **示例**: ```java List&lt;String&gt; list = new ...

    softwarefinish.zip

    3. **类型推断**(Type Inference for Generic Instance Creation):在创建泛型实例时,编译器可以自动推断类型,简化代码,如`List&lt;String&gt; list = new ArrayList();` 4. **switch语句支持字符串**:扩展了switch...

    马士兵J2SE第七章容器个人学习笔记.pdf

    【泛型(Generic)与自动装箱(Auto Boxing)与拆箱(Unboxing)】 泛型是Java SE 5.0引入的新特性,允许在声明类、接口和方法时指定类型参数,增强了代码的类型安全性和可读性。自动装箱是将基本类型自动转换为对应...

    YuanGoLearnSomething:一个存储我的知识,我的笔记和日常生活想法的地方

    6. **Generic(泛型)**:C#的泛型允许创建可重用的数据结构和算法,不依赖具体类型,提高了代码的复用性,同时保持了类型安全。 7. **Multithreading**:C#提供了System.Threading命名空间,支持多线程编程,可以...

    整合spring3-hibernate的小项目(二)

    博客文章 【SSH学习笔记】整合spring3-hibernate的小项目(二) 配套资源 需求分析: 1、使用spring注入dataSourse数据...3、用generic接口及其实现类,实现泛型化的查询所有和按字符串查询的方法 4、使用JUNIT测试

    Scala-Tutorial:Scala语法学习笔记与程式码范例from 韩顺平老师教学

    10. 泛型:支持泛型,允许定义类型参数化的类和方法。例如: ```scala def genericMethod[T](arg: T): T = arg ``` 11. 类型别名:创建新的类型名称,如`type MyInt = Int`。 六、集合库 12. 集合API:Scala提供了...

Global site tag (gtag.js) - Google Analytics