java泛型

Class<T>在实例化的时候,T要替换成具体类
Class<?>它是个通配泛型,?可以代表任何类型

<? extends T>受限统配,表示T的一个未知子类。
 <? super T>下限统配,表示T的一个未知父类。

 

ava 的泛型,只是编译时作为类型检查,一旦编译完成,泛型就会被擦除,在运行期间是得不到泛型的信息的,包括它的类型参数。有时候我们需要用到泛型的类型参数,反射看起来是取不到的,因反射在运行期间执行,但那时已无泛型的信息。一些构架却办到了,那么它们是怎么实现的呢?请看下面代码: 

[java]  view plain copy
 
  1. import java.lang.reflect.*;  
  2. import java.util.*;  
  3.   
  4. class Test {  
  5.     public static void main(String args[]) throws Exception {  
  6.         Method applyMethod=Test.class.getMethod("applyVector", Vector.class);  
  7.         Type[] types=applyMethod.getGenericParameterTypes();  
  8.         System.out.println(types[0].toString());  
  9.     }  
  10.     public static void applyVector(Vector<Date> v1){  
  11.           
  12.     }  
  13. }  

看到了,实际上是通过获得方法,再取得方法的类型参数,这样泛型的实际类型参数就出来了。上面代码输出:java.util.Vector<java.util.Date>,如果不只一个参数,要具体的类型参数呢?

[java]  view plain copy
 
  1. import java.lang.reflect.*;  
  2. import java.util.*;  
  3.   
  4. class Test {  
  5.     public static void main(String args[]) throws Exception {  
  6.         Method applyMethod=Test.class.getMethod("applyVector", Vector.class);  
  7.         Type[] types=applyMethod.getGenericParameterTypes();  
  8.         ParameterizedType pType=(ParameterizedType)types[0];  
  9.         System.out.println(pType.getActualTypeArguments()[0]);  
  10.         System.out.println(pType.getRawType());  
  11.   
  12.     }  
  13.     public static void applyVector(Vector<Date> v1){  
  14.           
  15.     }  
  16. }  

输出:

class java.util.Date
class java.util.Vector


可见,getActualTypeArguments 能取得实际类型参数,getRawType() 取得原本的类型。

 

 3:T...java中可变参数

Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。注意:可变参数必须位于最后一项。当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数。因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。

可变参数的特点:

(1)、只能出现在参数列表的最后; 

(2)、...位于变量类型和变量名之间,前后有无空格都可以;

(3)、调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。

apache lang 中StringUtils

@Test
    public void testJoin_Objects() {
        assertEquals("abc", StringUtils.join("a", "b", "c"));
        assertEquals("a",   StringUtils.join(null, "", "a"));
        assertEquals(null,  StringUtils.join((Object[])null));
    }

 public static <T> String join(final T... elements) {
        return join(elements, null);
    }

 public static String join(final Object[] array, final String separator) {
        if (array == null) {
            return null;
        }
        return join(array, separator, 0, array.length);
    }


 public static String join(final Object[] array, String separator, final int startIndex, final int endIndex) {
        if (array == null) {
            return null;
        }
        if (separator == null) {
            separator = EMPTY;
        }

        // endIndex - startIndex > 0:   Len = NofStrings *(len(firstString) + len(separator))
        //           (Assuming that all Strings are roughly equally long)
        final int noOfItems = endIndex - startIndex;
        if (noOfItems <= 0) {
            return EMPTY;
        }

        final StringBuilder buf = new StringBuilder(noOfItems * 16);

        for (int i = startIndex; i < endIndex; i++) {
            if (i > startIndex) {
                buf.append(separator);
            }
            if (array[i] != null) {
                buf.append(array[i]);
            }
        }
        return buf.toString();
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值