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

来源:互联网 发布:群发软件哪个好 编辑:程序博客网 时间:2024/05/02 19:56

------- 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在CODE上查看代码片派生到我的代码片
  1. public class GenericDemo {    
  2.         
  3.     public static void main(String[] args) throws Exception {    
  4.         //定义一个用Integer泛型限定的集合     
  5.         ArrayList<Integer> al1 = new ArrayList<Integer>();    
  6.         al1.add(123);    
  7.        //al1.add("abc");    不能加入String类型,因为对al做了泛型限定,只能加入Integer类型     
  8.             
  9.         //定义一个用String泛型限定的集合     
  10.         ArrayList<String> al2 = new ArrayList<String>();    
  11.         al2.add("sss");    
  12.        //al2.add(111);    不能加入Integer类型,因为对al做了泛型限定,只能加入String类型     
  13.             
  14.         //比较al1与al2的Class类是否相同,结果发现是相同的,那么说明泛型只是作用在编译时     
  15.         System.out.println(al1.getClass()==al2.getClass());    
  16.             
  17.        //既然泛型只作用于编译时,那么用反射穿过编译器,直接往ArrayList类中加入泛型限定外的类型     
  18.         //通过反射往al1中加入String类型 “abc”     
  19.         al1.getClass().getMethod("add", Object.class).invoke(al1, "abc");    
  20.        System.out.println(al1.get(1));    
  21.        //通过编译,并打印出abc     
  22.     }    
  23.     
  24. }    


 

 

泛型限定:

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

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在CODE上查看代码片派生到我的代码片
  1. Map<Integer,String> map = new HashMap<Integer,String>();  
  2.   
  3. map.put(1,"zhangsan1");  
  4. map.put(2,"zhangsan2");  
  5. map.put(3,"zhangsan3");  
  6. map.put(4,"zhangsan4");  
  7.   
  8. Set<Map.Entry<Integer,String>> entrySet = map.entrySet();  
  9.   
  10. for(Map.Entry<Integer,String> entry : entrySet){  
  11.     String key = entry.getKey();  
  12.     String value = entry.getValue();  
  13.     System.out.println(key+":"+value);  
  14. }  


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

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <p>Method applyMethod = GenericTest.class.getMethod("applyVector",Vector.class);  
  2. //函数参数类型  
  3. Type[] types = applyMethod.getGenericParameterTypes();  
  4. ParameterizedType pType = (ParameterizedType)types[0];  
  5. //原始类型  
  6. System.out.println(pType.getRawType());  
  7. //实际参数类型  
  8. System.out.println(pType.getActualTypeArguments()[0]);</p><p>public static void applyVector(Vector<Date> v1){</p><p>}</p>
0 0
原创粉丝点击