黑马程序员技术交流社区

标题: 基础加强中泛型问题(继续求高人回答) [打印本页]

作者: 曹睿翔    时间: 2013-4-8 23:39
标题: 基础加强中泛型问题(继续求高人回答)
本帖最后由 曹睿翔 于 2013-4-10 06:38 编辑

我的疑问,ParameterizedType 是Type接口的子类接口,其中有三个方法,上述代码中调用了 pType.getRawType()和pType.getActualTypeArguments()[0]这两个,接口中的方法都是抽象的,没有方法体,怎么能调用,并能返回值?
ParameterizedType pType = (ParameterizedType)types[0];//这一句很奇葩啊,算不算面向接口编程?接口类型变量能调用其抽象方法?
  1. public class GenericTest {
  2.         public static void main(String[] args) throws Exception {Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);
  3.                 Type[] types = applyMethod.getGenericParameterTypes();
  4.                 ParameterizedType pType = (ParameterizedType)types[0];
  5.         //参数化类型ParameterizedType
  6.                 System.out.println(pType.getRawType());
  7.           //原始类型,Class java.util.vector
  8.                 System.out.println(pType.getActualTypeArguments()[0]);
  9.         //实际参数化类型的数组,打印结果Class java.util.Data
  10.         }
  11.         
  12.         public static void applyVector(Vector<Date> v1){
  13.                
  14.         }
  15. }
复制代码

作者: 曹睿翔    时间: 2013-4-8 23:44
知识背景:知识的引入是这样的,本想通过Class字节码获取方法的泛型,但是泛型是给编译器看的,所以字节码中不包含泛型信息,这时想到可以通过JDK 1.5 新特性  java.lang.Reflect.Method中的新方法,可以返回参数列表的泛型,Type[]  getGenericParameterTypes()   
作者: 原满    时间: 2013-4-9 01:07
Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);   //得到一个Method 对象  applyMethod
Type[] types = applyMethod.getGenericParameterTypes();            //调用Method类 的实例方法   getGenericParameterTypes()   返回一个 Type对象的数组
ParameterizedType pType = (ParameterizedType)types[0];          //types[0] 即为Type[]数组的第一个元素 即为 Type类的实例    并强转为 ParameterizedType类型  得到
                                                                                           //ParameterizedType类的实例  pType


作者: 曹睿翔    时间: 2013-4-9 09:30
原满 发表于 2013-4-9 01:07
Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);   //得到一个Method 对 ...

多谢顶贴,可是我的疑问不是你回答的,多认真回答其他帖子吧,技术分还是很容易得的
作者: 杨玉辉    时间: 2013-4-9 11:12
好像这个不是面向接口,张老师 在举着个例子的时候,提到了源程序提供了一个方法,编译之后,就会有个去参数化的操作,你使用的类型只能是Date 类型的,否则不通过,获取的是泛型的类型,就是指这个情况下的泛型类型,并不是通用的,接口中没有具体的函数体,要实现覆盖之后的方法,才能调用,也就是这个时候的参数的泛型
public static void applyVector(Vector<Date>,v)
{
}
作者: 陈丽莉    时间: 2013-4-9 14:51
曹睿翔 发表于 2013-4-9 09:30
多谢顶贴,可是我的疑问不是你回答的,多认真回答其他帖子吧,技术分还是很容易得的 ...

10分以下,还是加分了,呵呵~  
作者: 贾振凯    时间: 2013-4-9 15:51
本帖最后由 贾振凯 于 2013-4-9 16:05 编辑

applyMethod.getGenericParameterTypes();这个方法返回的应该是实现了ParameterizedType接口的实例对象所组成的数组,用到的是多态!


作者: 曹睿翔    时间: 2013-4-10 06:38
杨玉辉 发表于 2013-4-9 11:12
好像这个不是面向接口,张老师 在举着个例子的时候,提到了源程序提供了一个方法,编译之后,就会有个去参 ...

确实很特殊,张老师也说了,是从hibernate中找出的源码,暂时这么记着吧




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2