本帖最后由 杨玲 于 2013-2-4 19:39 编辑
------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----------
今天总结一下泛型的知识.关于泛型它比较突出的作用我感觉就是在提高代码复用性的同时,对类型进行限定.对于它的好处呀什么的我就不总结了,
今天总结的内容主要包括以下几点.
1.泛型的基本语法以及应用.
3.泛型的注意事项.
4.泛型的作用域
首先是第1点.先说泛型的声明语法.在JAVA中泛型可以声明在接口,类或者方法上.它相当于一种修饰符 声明格式有:
任意类型的声明.
1.<TypeName> //声明一个类型为TypeName的类型(注意是类型),而这个类型可以用任意的引用数据类型来实例化
2.<?> //声明一个可以用任意的引用数据类型来实例化的匿名类型
对类型进行一定限定的声明.
1. <TypeName extends 上限类型> //声明一个类型为TypeName的类型(注意是类型),而这个类型必须是上限类型或者是继承自上限类型的类型,
<TypeName super 下限类型> //声明一个类型为TypeName的类型(注意是类型),而这个类型必须是下限类型或者是下限类型的父类,
2. <? extends 上限类型> //声明一个可以用任意的继承自上限类型的类型来实例化的匿名类型
<? super 下限类型> //声明一个可以用任意的下限类型或者是下限类型的父类型来实例化的匿名类型
那么,知道声明的语法了,我们自然是要声明两个出来玩玩,
//声明在类上.声明在接口或者抽象类上也是一样的用法.
class Demo<TypeName>
{
//注意了,前面说过,泛型就相当于是一个修饰符,所以在修饰类的时候,必须声明在类名之后
}
//声明在方法上
public <TypeName> void function()
{
//和前面一样,必须声明在返回值之前,其它修饰符之后.
}
*/
现在是应用语法.从前面的声明可以知道,声明出来的其实是一个类型,那么我们自然可以用这个类型来定义对象.现在我们来用一用
首先得有个类吧.另外再在这个类上面声明一个泛型
public class Generic<TypeName>
{
//前面既然都声明了一个泛型类型,那么我们自然可以用它来定义一个变量了,就像下面这样.
private TypeName element;
//自然的也就可以把这个类型的变量作为函数的参数了,是吧,这里就写一个构造方法吧.
public Generic(TypeName element)
{
this.element = element;
}
//再然后,我们还可以把这种类型作为返回值咯,很自然的,我也就定义了一个GET方法,就像下面这样.
public TypeName getElement()
{
return element;
}
//当然了,用在静态方法上就不行了,但是我们可以在静态方法上另外定义一个泛型嘛.就像这样.
public static <T> void sop(T t)
{
System.out.println(t);
}
//另外再定义一个返回值和参数类型都是泛型类型的方法吧,
public TypeName setElement(TypeName element)
{
TypeName temp = this.element;
this.element = element;
return temp;
}
}
/*
不知道看完上面这段代码,对泛型的用法也清楚了吧?呵呵,接下来是第2点使用泛型时的注意事项.
好吧,既然前面我们已经定义了一个带泛型的类,那么,我们就要把它利用起来吧?
搞个主函数吧.
*/
class Demo
{
public static void main(String[] args)
{
/*首先我得用用我的泛型类.那就new一个对象吧.我可以就像创建一个普通的对象一样去创建它.
当然了,这样我可以用任意的引用数据类型来初始化它,然而泛型的作用除了提高复用性以外还得
保证一定的安全性,也就是另一个特性:类型的限定 */
Generic grc = new Generic("abc");
//而且使用带泛型类型作为返回值的方法时,我们就必须进行强制的转换了.如下:
String str = (String)grc.getElement();
/* 下面就对类型进行限定一下.在进行类型限定,也就是对类型变量进行实例化时.有几点需要注意的.
当等号的左边把泛型实例化了以后,那么右边的类型必须是与它实例化的类型一到的,这时是不考虑继承的.像
这种形式就不行: */
Generic<Object> grc3 = new Generic<String>("abc");
// 当等号左边的类型没实例化,那么就和普通的类型转换是一样的,左值必须是右值或者是右值的父类,不然在
// 运行时就会出现类型转换异常,像下面这样.
Generic<Integer> grc2 = new Generic("abc");
//所以在使用的时候还是尽量保证等号两边的类型是一样的吧!
Generic<String> grc1 = new Generic<String>("abc");
String str1 = grc1.getElement();
// 在方法的返回值是泛型类型时,就更加复杂了,但是还是遵从上面所说到的左右值的规则.还有一个
// 类型推断的说法,这一部分我也不太明白,所以就不显摆了
}
}
/*
接着是第3点,泛型的作用域.我们都知道,一个JAVA程序要运行,需要经过几个阶段.
第一个是编译阶段:把代码编译成class文件.也就是二进制代码.
第二个是运行阶段:把这些二进制代码一条条的执行.
泛型在JAVA中的生命周期只是在编译阶段的,知道了这一点,在需要时,我们就可以通过反射来跳过泛型了.
好了,泛型的总结差不多就这些了,晚安!
*/
|
|