深圳网站seo哪家快,建网页的软件,做网站服务器空间,网站制作怎么填前言#xff1a; java的泛型上下限不是很好理解#xff0c;尤其像我这种菜鸡。反反复复看了好几遍了...#xff0c;真是... 一、简单的继承体系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限#xff08;extends 关键字#x… 前言 java的泛型上下限不是很好理解尤其像我这种菜鸡。反反复复看了好几遍了...真是... 一、简单的继承体系 class Person{}class Student extends Person{}class Worker extends Person{} 二、泛型上限extends 关键字 public static void upperBound(List? extends Person list, Person p){//正确因为null没有类型信息 list.add(null);//错误因为list的参数类型可能是Person的子类list.add(p);①//成功获取if(list.size() 0){Person pp list.get(0);②}} ①处的错误在于list的参数类型是不确定的其参数类型可能是 Person的子类子类集合List不能添加父类的元素。测试如下 public static void testUpperBound(){ArrayListStudent slist new ArrayListStudent();Person p new Person();upperBound(slist, p);//无法添加成功} 如何解决泛型上限添加问题可以使用泛型方法如下 public static T extends Person void upperBound2(ListT list, T p){list.add(p);} public static void testUpperBound2(){ArrayListPerson plist new ArrayListPerson();Person p new Person();Student s new Student();upperBound2(plist, p);upperBound2(plist, s);} 也就是说使用泛型上限add方法时集合参数类型 和 元素参数类型 要一致这样添加的时候才不会有矛盾。看一下eclipse中对upperBound2(plist, s);这个函数调用的提示如下 可见T类型最终会解析为 泛型的最上限类型Student s相应的向上转型。 接着说 ② 处为什么能获取成功呢泛型上限嘛至少上限的类型是确定的所有的上限类型的子类都可以进行向上转型自然获取是不成问题了。 三、泛型的下限 public static void lowerBound(List? super Student list){Person var new Person();//错误list的参数类型可能是 Student这样就不能添加父类Person了所以 变量var的类型 必须是 Student或者 Student的子类list.add(p);①//正确Student s new Student();list.add(s);} public static void testlowerBound(){ArrayListPerson list new ArrayListPerson();lowerBound(list);} ①处添加失败告诉我们泛型下限使用add方法添加元素时元素的参数类型必须是 下限 或者 下限的子类型。否则会出现子类集合添加父类元素。 public static void lowerBound2(List? super Person list){Person p new Person();list.add(p);//获取不能编译Person as list.get(0);①} public static void testlowerBound2(){ArrayListPerson list new ArrayListPerson();lowerBound2(list);} ①处获取失败了我们看一下eclipse提示我们该怎么办 将 第二个方法 将as的类型更改为Object 和 泛型的下限 结合一下考虑一下add(e)方法在正确添加后都会成为Object对象在使用get(index)方法时会转换为 ? super Person类型可能是Person类型也可能是Person的父类类型甚至是Object执行Person as list.get(0)那么就有了 向下转型。java中无法保证向下转型是安全的。所以①处不能编译。 四、泛型上限最常见的一个应用 ListPerson plist new ArrayListPerson();
ListStudent slist new ArrayListStudent();plist.addAll(slist); 五、泛型下限最常见的一个应用 SetStudent set new TreeSetStudent(new ComparatorPerson() {Overridepublic int compare(Person o1, Person o2) {return 0;}
}); 六、泛型上下限一个综合的例子 注个人瞎掰的...就是将上面两个例子结合在一起 SetPerson set new TreeSetPerson(new ComparatorPerson() {Overridepublic int compare(Person o1, Person o2) {return 0;}
});
ListStudent slist new ArrayListStudent();
ListWorker wlist new ArrayListWorker();
set.addAll(slist);
set.addAll(wlist); 接下来研究一下泛型的擦除... 转载于:https://www.cnblogs.com/hujunzheng/p/5351697.html