A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曹睿翔 金牌黑马   /  2013-4-8 23:39  /  1564 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曹睿翔 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 好晕。。

查看全部评分

7 个回复

倒序浏览
知识背景:知识的引入是这样的,本想通过Class字节码获取方法的泛型,但是泛型是给编译器看的,所以字节码中不包含泛型信息,这时想到可以通过JDK 1.5 新特性  java.lang.Reflect.Method中的新方法,可以返回参数列表的泛型,Type[]  getGenericParameterTypes()   
回复 使用道具 举报
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

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
原满 发表于 2013-4-9 01:07
Method applyMethod = GenericTest.class.getMethod("applyVector", Vector.class);   //得到一个Method 对 ...

多谢顶贴,可是我的疑问不是你回答的,多认真回答其他帖子吧,技术分还是很容易得的
回复 使用道具 举报
好像这个不是面向接口,张老师 在举着个例子的时候,提到了源程序提供了一个方法,编译之后,就会有个去参数化的操作,你使用的类型只能是Date 类型的,否则不通过,获取的是泛型的类型,就是指这个情况下的泛型类型,并不是通用的,接口中没有具体的函数体,要实现覆盖之后的方法,才能调用,也就是这个时候的参数的泛型
public static void applyVector(Vector<Date>,v)
{
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
曹睿翔 发表于 2013-4-9 09:30
多谢顶贴,可是我的疑问不是你回答的,多认真回答其他帖子吧,技术分还是很容易得的 ...

10分以下,还是加分了,呵呵~  
回复 使用道具 举报
本帖最后由 贾振凯 于 2013-4-9 16:05 编辑

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

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
杨玉辉 发表于 2013-4-9 11:12
好像这个不是面向接口,张老师 在举着个例子的时候,提到了源程序提供了一个方法,编译之后,就会有个去参 ...

确实很特殊,张老师也说了,是从hibernate中找出的源码,暂时这么记着吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马