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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马肖凯骏 中级黑马   /  2012-3-18 10:25  /  2278 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public <T> T[] add(T... s)
  2.         {
  3.                
  4.                 return s;
  5.         }
复制代码
我定义了一个泛型方法,我要求返回一份泛型数组,这个数组可以存放任意类型的数据,

返回类型是泛型 那么我该用怎么定义接收这个泛型数组?

例如:T []  m=add("sss",1,2,3);  这样在主方法中定义的话报错

那么我该如何取得add()方法返回的泛型数组?

3 个回复

倒序浏览
泛型方法有返回值 所以 T 的类型是有返回值决定的。
泛型方法类型参数的类型判断
编译器判断泛型方法的实际类型参数的过程称为类型推断,类型推断是相对于知觉推断的
其实现方法是以一种非常复制的过程。
根据调用泛型方法时实际传入的参数类型或返回值的类型来推断,具体规则如下:
1,当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被应用了,那么根据调用方法时       
   该处的实际类型类确定,这很容易凭感觉推断出来,
   eg:swap(new String[3],3,4) --> static <E> void swap(E[] a,int i, int j); String
2,当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处
   的实际应用类型都对应同一种类型来确定,这很容易凭感觉推断出来
   eg:add(3,5) --> static <T> add(T a,T b);  Integer
3, 当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处
   的实际应用类型都对应到了不同的类型,并且没有返回值,这时候读取多个参数中的最大交际类型,
   例如,下面语句实际对应的类型是Number了,编译没问题,只是运行时出问题:
   fill(new Integer[3],3.5f)--> static <T> fill(T[] a,T v); Nubmer
4, 当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处
   的实际应用类型都对应到了不同的类型,并且使用返回值,这时候优先考虑返回值的类型,例如
   下面的语句实际对应的类型是Integer,编译将报告错误,将变量x的类型改为float,对比eclipse的
   错误提示,int x = add(3,3.5) --> static <T> T add(T a,T b); Integer
5, 参数类型的类型推断具有传递性,下面第一种情况推断实际参数类型为Object,编译没有问题,而第
   二种情况则根据参数化的Vector类实例将类型变量直接确定为String类型,编译将出现问题:
   copy(new Integer[5],new String[5]) --> static <T> void copy(T[] a,T[] b);
   copy( new Vector<String> , new Integer[5]) -- static <T> void copy(Collection<T> c,T[] t); String

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张锦萍 于 2012-3-21 11:55 编辑

我试了一下,转化为Object[]就可以操作加进去的数据了,
Object[] objs = add(1,2,"aa");
    for(Object obj : objs ){
         System.out.println(obj);
    }
回复 使用道具 举报
你好,我是刚加的黑马,想问问你怎样加技术分哪?我才刚刚起步,我看到你们的技术分都加够了。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马