关于一种泛型方法的作用 Java泛型方法有一种写法是这样的public <T extends X> void Test(T t) {...}这种方式是不是和public void Test(X t) {...}效果是一样的?那么搞出来这种泛型方式有什么用呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 泛型的作用有很多:1) 可以限制某个类必须继承某个类才能使用如<T extends X> 如果T不是继承X就不能当作返回值2)在集合类广泛 使用泛型 List<String> a= new ArrayList<String>();如果你这样定义就不能把其他类型添加到该集合里。 第一个的意思是:先说明T与X是一种子父类的关系,然后传给Test方法一个T的引用作为形式参数,所以,对下面的程序起到一定的指示作用,第二个的意思就简单的认为传给Test方法一个X的引用t作为形式参数,没有继承关系 感谢关注,我的意思是比方这样写public <T extends Runnable> Test1(T t) {...}和public void Test(Runnable t) {...}两种方式都可以接受实现Rnnable接口的类型参数,在我看起来没有区别。 、对于lz的意思,我想是这样的,总结为以下几点:1. Runnable是一个接口,应用实现而不是继承2. 假若父类X能够被子类T继承,T可以重写X中的一个方法,也可以几个,是任意选择的,而实现某个接口,就必须重写它的所有方法,对于Runnable中只有一个run方法,所以对于lz说的没有区别是不对的,,首先假设Runnable是一个类(实际是接口)的话,在第一种语句中,t是T的引用,是Runnable子类的引用,可以调用run方法也可以不调用run方法,重要的是这个run方法可能会被重写,内容改变了,而第二种的t是Runnable的一个引用,调用的run方法就只能是Runnable自身的没被重写的run方法,是有区别的!!! 在这个例子中没有区别,因为T是extends X,所以参数改用X也能对应一切继承X的参数所以两种写法是等效的,可以通过方法签名来判断它们编译后(即泛型擦除后)是一致的比如public <T extends X> void Test(T t) {}public void Test(X t) {} //重载Test方法,编译时可发现会造成冲突而编译失败 一般在这种泛型应用中,带有返回值的方法更能显示泛型的优点比如public <T extends X> getX(Class<T> clazz) { retun (T)clazz.newInstance(); //方法内部作了转换,方法外不需要强行转换为实际的T}//如果改成public X getX(Class<? extends X> clazz) { return clazz.newInstance(); //方法内部没有转换,方法外部需要自己转换}//则外部需要自己转换targetClass t = (targetClass)getX(targetClass.class);显然,这种情况泛型就要简单明了多了 关于字符编码的疑问 关于java的文件下载的问题 用java.util.zip包无法解压缩cab格式的压缩文件 急用,谢谢:JAVA有关鼠标画图 java用表格做成像灰鸽子表格那样的功能! 请问高手关于jdbc连接sql server问题 怎样去掉按钮的事件监听器?? [求助]关于数据库传值 怎么实现放大缩小显示图片 java新手求助,用jdk编程怎么查帮助啊? 从内部类访问局部变量,局部变量需要被声明为final,为神马? 我写了一个程序不知怎么回事不对请高手帮我看一下
如果T不是继承X就不能当作返回值
2)在集合类广泛 使用泛型 List<String> a= new ArrayList<String>();
如果你这样定义就不能把其他类型添加到该集合里。
第二个的意思就简单的认为传给Test方法一个X的引用t作为形式参数,没有继承关系
1. Runnable是一个接口,应用实现而不是继承
2. 假若父类X能够被子类T继承,T可以重写X中的一个方法,也可以几个,是任意选择的,而实现某个接口,就必须重写它的所有方法,对于Runnable中只有一个run方法,所以对于lz说的没有区别是不对的,,首先假设Runnable是一个类(实际是接口)的话,在第一种语句中,t是T的引用,是Runnable子类的引用,可以调用run方法也可以不调用run方法,重要的是这个run方法可能会被重写,内容改变了,而第二种的t是Runnable的一个引用,调用的run方法就只能是Runnable自身的没被重写的run方法,是有区别的!!!
所以两种写法是等效的,可以通过方法签名来判断它们编译后(即泛型擦除后)是一致的
比如
public <T extends X> void Test(T t) {}
public void Test(X t) {} //重载Test方法,编译时可发现会造成冲突而编译失败 一般在这种泛型应用中,带有返回值的方法更能显示泛型的优点比如
public <T extends X> getX(Class<T> clazz) {
retun (T)clazz.newInstance(); //方法内部作了转换,方法外不需要强行转换为实际的T
}//如果改成
public X getX(Class<? extends X> clazz) {
return clazz.newInstance(); //方法内部没有转换,方法外部需要自己转换
}
//则外部需要自己转换
targetClass t = (targetClass)getX(targetClass.class);显然,这种情况泛型就要简单明了多了