------- 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);
- }
通过反射获得泛型的实际类型参数:
- <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>