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

------- 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 -------->原始类型

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

 

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>();

 

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

 

泛型类型的综合应用

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);
}


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

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]);

public static void applyVector(Vector<Date> v1){

}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值