回顾第一次基础加强
1. 反射
有一个字符串,它是一个类名称,我们可以使用反射来创建这个类的对象!
有一个字符串,它是一个方法名称,我们可以使用反射来调用这个方法!
2. 枚举
枚举是一种多例模式!你学过单例就可以理解多例!一个类有固定的实例个数!
1) 枚举的格式
关键字不是:class、interface,它是enum
enum 名称{
选项1,选项2....;//如果在枚举后还有其他内容,那么必须给出分号,如果没有内容了,可以不给出分号。
}
2) 枚举类都有一个共同的父类,Enum
-------------------------
泛型
1. 把运行时的一部分ClassCastException异常,转移到编译时!
2. 省去了一部分的强转的代码!
3. 如何来写一个泛型类!
class A<T> {
private T t;
public T get() {}
public void set(T t) {}
}
4. 如何来写一个泛型方法
特点:返回值、参数中都会使用T(泛型)
调用时为ts指定类型之后,会隐式为T赋值!String[] strs = {...}; get(str);
显式赋值:MyClass.<String>get(strs)
class MyClass {
public static <T> T get(T[] ts) {//返回数组中中间元素的值
return ts[ts.length/2];
}
}
============================
1. 泛型类的子类,以及泛型接口的实现类怎么写!
* 父类是泛型的,但子类不一定是泛型的
* 一般子类都需要给父类的泛型赋值!
> 子类不是泛型类,为父类的泛型赋值为类型常量
> 子类是泛型类,为父类的泛型赋值为自己的泛型
class A<T> {}
class AA1 extends A<String> {
}
class AA2<E> extends A<E> {
}
2. 泛型中的通配符
1). 泛型是假的,因为在JVM中泛型已经被擦除了!
2). 泛型就出现了引用的泛型,与new一边的泛型必须相同,例如:List<Object> list = new List<String>()这是不行的!
3). 因为2)的问题,导致方法不通用!我们写一个方法,参数为List<Object>,但是因为泛型是假的原因,所以不能使用List<String>来调用!
4). 使用通配符来处理方法的通用性问题。
> *通配符<?>:所有泛型方法都作废
> 子类通配符<? extends Xxx>:返回值为泛型的方法可用!
> 父类通配符<? super Xxx>:参数为泛型的方法可用!
注意:通配符只能出现在引用一端,而创建对象时,不能使用通配符!new ArrayList<?>(),不行!
通配符大多都出现在:方法的形式参数
class List {
addAll(Collection<? extends E> c)
}
List<Number> list = new ArrayList<Number>();
List<Integer> intList = ...();
list.addAll(intList);
3. 反射与泛型之间有什么关系!