通配符与嵌套
通配符
为什么使用通配符,比如有个打印方法根据Key打印Value如下示例,在使用showKeyValue1()方法打印不是String类型的泛型时编译器就会报错。(注:Generic为泛型类)
// 主方法
public static void main(String[] str){
// Ingeter类型泛型对象
Generic<Ingeter> obj1 = new Generic<Ingeter>;
// String类型泛型对象
Generic<String> obj2 = new Generic<String>;
// 打印Ingeter类型泛型
// 这个方法编译器会报错:Generic<java.lang.Integer> cannot be applied to Generic<java.lang.Number>
showKeyValue1(obj1);
// 打印String类型泛型
showKeyValue1(obj2);
// 因showKeyValue1方法的局限性,导致在传入未知类型时编译器报错
// 由此类型通配符应运而生,如Object是所有类的父类,这里'?'是所有泛型的父类一样
showKeyValue2(obj1);
showKeyValue2(obj2);
}
// 打印方法1
public void showKeyValue1(Generic<String> obj){
Log.d("泛型测试", "key:" + obj.getKey);
}
// 打印方法2
public void showKeyValue2(Generic<?> obj){
Log.d("泛型测试", "key:" + obj.getKey);
}
类型通配符一般是使用'?'代替具体的类型实参,'?'是类型实参,而不是类型形参 。直白点的意思就是,'?'和String、Integer一样都是一种实际的类型,可以把'?'看成所有类型的父类。是一种真实的类型。
可以解决当具体类型不确定的时候,这个通配符就是'?' ;当操作类型时,不需要使用类型的具体功能时,只使用Object类中的功能。那么可以用'?' 通配符来表未知类型。
嵌套
什么是泛型嵌套,通过如下示例理解:(家庭)
// 家庭
public class Family<T> {
// 成员
private Map<String, T> members = new HashMap<>();
// 设置
public addMember(String name, T t){
if (t != null) {
members.put(name, t);
}
}
// 获取
public T getMember(String name){
return members.get(name);
}
}
// 成员
public class Member<E> {
// 性别
private E sex;
// 设置
public void setSex(E e){
this.sex = e
}
// 获取
public E getSex(){
return sex;
}
}
// 性别
public class Sex { }
// 性别男
public class Male extends Sex {
// 具有的特征
...
}
// 性别女
public class Girl extends Sex {
// 具有的特征
...
}
public static void main(String[] strs) {
// 家庭成员1
Member<Male> member1 = new Member<Male>();
// 家庭成员2
Member<Girl> member2 = new Member<Girl>();
// 家庭
Family<Member<Sex>> family = new Family<Member<Sex>>();
// 添加成员
family.addMember("张三", member1);
family.addMember("李四", member2);
}
如下示例
// HashMap
Map<String,String> map = new HashMap<String,String>();
map.put("a", "老大");
map.put("b", "老二");
Set<Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() +"--->"+ entry.getValue());
}