java 对泛型的理解_对java泛型的理解

一, 什么是泛型

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的

强制类型转换

,而这种转换是要求开发者对

实际参数

类型可以预知的情况下进行的。对于

强制类型转换

错误的情况,

编译器

可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

泛型的好处是在编译的时候检查

类型安全

,并且所有的

强制转换

都是

自动

隐式

的,提高代码的重用率。

二 泛型的优点

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

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

3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。

Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

泛型在使用中还有一些规则和限制:

1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。

2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。

3、泛型的类型参数可以有多个。

4、泛型的参数类型可以使用extends语句,例如。习惯上成为“有界类型”。

5、泛型的参数类型还可以是通配符类型。例如Class> classType = Class.forName(Java.lang.String);

三 java泛型方法的使用

/**

*

*/

/**

* @author sun

*

*/

class Point { // 此处可以随便写标识符号,T是type的简称

private T var; // var的类型由T指定,即:由外部指定

public T getVar() { // 返回值的类型由外部决定

return var;

}

public void setVar(T var) { // 设置的类型也由外部决定

this.var = var;

}

};

public class GenericsDemo {

public static void main(String args[]) {

Point p = new Point(); // 里面的var类型为String类型

p.setVar("it"); // 设置字符串

System.out.println(p.getVar().length()); // 取得字符串的长度

}

};

class Info< T>{

private T var ; // 定义泛型变量

public void setVar(T var){

this.var = var ;

}

public T getVar(){

return this.var ;

}

public String toString(){ // 直接打印

return this.var.toString() ;

}

};

public class GenericsDemo{

public static void main(String args[]){

Info< String> i = new Info< String>() ; // 使用String为泛型类型

i.setVar("it") ; // 设置内容

fun(i) ;

}

public static void fun(Info< ?> temp){ // 可以接收任意的泛型对象

System.out.println("内容:" + temp) ;

}

};

/**

*

*/

/**

* @author sun

*

*/

interface Info { // 在接口上定义泛型

public T getVar(); // 定义抽象方法,抽象方法的返回值就是泛型类型

}

class InfoImpl implements Info { // 定义泛型接口的子类

private T var; // 定义属性

public InfoImpl(T var) { // 通过构造方法设置属性内容

this.setVar(var);

}

public void setVar(T var) {

this.var = var;

}

public T getVar() {

return this.var;

}

};

public class GenericsDemo {

public static void main(String arsg[]) {

Info i = null; // 声明接口对象

i = new InfoImpl("汤姆"); // 通过子类实例化对象

System.out.println("内容:" + i.getVar());

}

};

四 泛型的例子

五 提示

什么时候定义泛型类

当类中要操作的引用数据类型不确定的时候,早期定义object来完成扩展,现在定义泛型来完成扩展。

泛型类定义的泛型,在整个类中有效。如果方法被使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定。

为了让不同方法可以操作不同类型,而且类型还不确定,那么可以将泛型定义在方法上。

特殊之处:

静态方法不可以访问类上定义的泛型。

如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值