您的位置:首页 > 职场人生

黑马程序员——注解&泛型

2014-01-10 09:00 190 查看
------- android培训java培训、期待与您交流!
---------- 

 

jdk1.5提供的3个主要注解:

1. @SuppressWarmings:忽略警告(可以是各种类型的警告)

2. @Deprecated:声明已过时的方法

3. @Override:用于覆盖,测试是否为复写的方法

 

 注解相当于一种标记,在程序中加了注解等于为程序打上了某种标记。

可以加在包,类,方法,字段,方法的参数以及局部变量上

 

 泛型中的通配符“?”.可以引用其他各种参数化的类型,通配符定义的变量主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法

通配符扩展:

限定通配符的上边界:Vector<? extends Number> x = new Vector<Integer>();

限定通配符的下边界:Vector<? super Integer> x = new Vector<Number>();

 

需要注意的是:

注解也是有生命周期的,并且可以声明存在的位置

这里便涉及到两个元注解:

Retention:声明注解的周期(RetentionPolicy.SOURCE:java源文件时检测,RetentionPolicy.CLASS:文件时检测,RetentionPolicy.RUNTIME:runtime时检测)

Target:声明注解可以用的位置(如类上,方法上,属性上等等)

 

 

 

 泛型

 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,将问题转换到编译时期。获取对象时,不再需要进行类型转换

 

ArrayList<E>类定义和ArrayList<Integer>类引用中的术语:

ArrayList<E> -----> 泛型类型

E --------> 类型变量或类型参数

ArrayList<Integer> -----> 参数化的类型

Integer --------> 类型参数的实例或实际类型参数

<> -------------> typeof

ArrayList -------->原始类型

参数化类型不考虑类型参数的继承关系

 

[java] view
plaincopy





public class GenericDemo {    

        

    public static void main(String[] args) throws Exception {    

        //定义一个用Integer泛型限定的集合     

        ArrayList<Integer> al1 = new ArrayList<Integer>();    

        al1.add(123);    

       //al1.add("abc");    不能加入String类型,因为对al做了泛型限定,只能加入Integer类型     

            

        //定义一个用String泛型限定的集合     

        ArrayList<String> al2 = new ArrayList<String>();    

        al2.add("sss");    

       //al2.add(111);    不能加入Integer类型,因为对al做了泛型限定,只能加入String类型     

            

        //比较al1与al2的Class类是否相同,结果发现是相同的,那么说明泛型只是作用在编译时     

        System.out.println(al1.getClass()==al2.getClass());    

            

       //既然泛型只作用于编译时,那么用反射穿过编译器,直接往ArrayList类中加入泛型限定外的类型     

        //通过反射往al1中加入String类型 “abc”     

        al1.getClass().getMethod("add", Object.class).invoke(al1, "abc");    

       System.out.println(al1.get(1));    

       //通过编译,并打印出abc     

    }    

    

}    

 

 

泛型限定:

<>中写入的类型即已经限定了可以使用的类型,它不仅仅用于集合上,还可以用在方法上、类上等,如:

public <T> void show(T t){……}

即可对接收的参数进行类型限定

public <A extends Collecton>A getCollection(Class<T> collection){……}

这里返回值是A类型,那么A是什么呢?用泛型来说明A就是Collection的子类,这样就方便使用许多了。

当泛型定义类上的时候,就是在类中所有的方法上使用了该泛型,如:

class Demo<T>{……}

定义后所有方法均视为对T使用,如:Demo<T> d = new Demo<T>();

 

泛型应当定义在返回值类型前 ;只有引用类型才能作为泛型方法的实际参数。

 

泛型类型的综合应用

[java] view
plaincopy





Map<Integer,String> map = new HashMap<Integer,String>();  

  

map.put(1,"zhangsan1");  

map.put(2,"zhangsan2");  

map.put(3,"zhangsan3");  

map.put(4,"zhangsan4");  

  

Set<Map.Entry<Integer,String>> entrySet = map.entrySet();  

  

for(Map.Entry<Integer,String> entry : entrySet){  

    String key = entry.getKey();  

    String value = entry.getValue();  

    System.out.println(key+":"+value);  

}  

 通过反射获得泛型的实际类型参数:

[java] view
plaincopy





<p>Method applyMethod = GenericTest.class.getMethod("applyVector",Vector.class);  

//函数参数类型  

Type[] types = applyMethod.getGenericParameterTypes();  

ParameterizedType pType = (ParameterizedType)types[0];  

//原始类型  

System.out.println(pType.getRawType());  

//实际参数类型  

System.out.println(pType.getActualTypeArguments()[0]);</p><p>public static void applyVector(Vector<Date> v1){</p><p>}</p>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: