黑马程序员技术交流社区
标题:
有关泛型的问题
[打印本页]
作者:
风云
时间:
2013-5-31 12:00
标题:
有关泛型的问题
本帖最后由 风云 于 2013-6-1 16:18 编辑
什么时候该用泛型呢?
作者:
yin1031468524
时间:
2013-5-31 12:19
只要在使用类或者接口时,该类或者接口在API文当描述时都带着<>就需要在使用时,定义泛型。
其实,泛型无非就是通过<>定义了一个形式参数。专门用于接收具体的引用类型。在使用时,一定要传递对应的实际参数类型。
有了泛型类,省去了曾经的强转和类型转换异常的麻烦。
泛型定义在方法上
class Tool2<W>{
public void show(W w){
System.out.println("show:"+w.toString());
}
public void myprint(W w){
System.out.println("myprint:"+a.toString());
}
复制代码
主函数中创建该泛型类对象,并调用该泛型类中的方法
Tool2<String> t = new Tool2<String>();
t.show("abc");
t.show(new Integer(4));这儿会编译失败。因为只能是String类
t.myprint("haha");
t.myprint(new Integer(4));同上。
}而我对这个myprint方法,想要操作的类型是不确定的,但是不一定和调用该方法的对象指定的类型一致。
*这时 可以将泛型定义在方法上。
public <A> void myprint(A a){
System.out.println("myprint:"+a.toString());
}此时,上面的t.myprint(new Integer(4));就不会再编译报错了
另外,静态方法不能访问类上定义的泛型,如果需要泛型,该泛型只能定义在方法上。即如果void前没有 <Y> ,会编译失败的。
public static <Y> void method(Y w){
System.out.println("method:"+w);
}
作者:
黑马-许鹏
时间:
2013-5-31 12:42
什么时候用泛型:当类中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,1.5版本以后可以用泛型来表示。这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。
泛型其实只在编译时期起作用,是给编译器使用的技术,到了运行时期,泛型就不存在了。因为泛型的擦除,也就是说,编辑器检查了泛型的类型正确后,在生成的类文件中是没有泛型的。
泛型是先定义后使用,一般情况下有三种定义:
一、
把泛型定义在类上,比如:
package com.itheima;
class Tool<Q> {
private Q obj;
public void setObject(Q obj) {
this.obj = obj;
}
public Q getObject() {
return obj;
}
}
复制代码
二、
把泛型定义在方法上:
public <W> void method(W w) {
System.out.println("method:" + w);
}
复制代码
注意:如果类里面有两个或两个以上的方法都用的同一个类型的参数,必须要把泛型定义在类上。
三、
把泛型定义在静态方法上:静态方法无法访问类上定义的泛型(因为对象传入的具体类型,没办作用在静态函数上),所以静态上要用泛型必须定义在静态方法上
public static <Q> void function(Q t) {
System.out.println("function:" + t);
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2