黑马程序员技术交流社区
标题:
泛型的问题
[打印本页]
作者:
李伟
时间:
2012-6-21 22:12
标题:
泛型的问题
本帖最后由 李伟 于 2012-6-22 12:15 编辑
? extends T和? super T到底什么区别,感觉不太好理解,明白的请举例说明一下,谢谢
作者:
淡然
时间:
2012-6-21 22:20
本帖最后由 淡然 于 2012-6-21 22:36 编辑
泛型限定
例:Student extends Person
ArrayList<Person> al =new ArrayList<Student>(); //错误,左右两边必须一致。左右两边不一致时易出安全问题。这时可以使用泛型限定
ArrayList<?extends Person> //只允许Person和它的子类,上限。如Collection类addAll(Collection<? extends E> c)
ArrayList<?super Student > //只允许Student和它的父类,下限。如TreeSet类
TreeSet(Comparator<? super E> comparator)
package hcy.test.main;
import java.util.ArrayList;
class Person{
}
class Student extends Person{
}
class Worker extends Person{
}
class Test
{
public static void main(String[] args)
{
Test t=new Test();
ArrayList<Person> al1=new ArrayList<Person>();
al1.add(new Person());
al1.add(new Person());
ArrayList<Student> al2=new ArrayList<Student>();
al2.add(new Student());
al2.add(new Student());
ArrayList<Worker> al3=new ArrayList<Worker>();
al3.add(new Worker());
al3.add(new Worker());
t.printFather(al1);
t.printFather(al2);
t.printFather(al3);//编译通不过,只允许Student和它的父类
t.printSon(al1);
t.printSon(al2);
t.printSon(al3);
}
public void printSon(ArrayList<? extends Person> al){
System.out.println("right!");
}
public void printFather(ArrayList<? super Student> al){
System.out.println("right!");
}
}
复制代码
作者:
田建
时间:
2012-6-21 22:48
关于? extends T和? super T到底什么区别,你对比一下自然就清楚了,?代表你要填进去的内容:
? extends T:代表的即是继承于T的那个类,因而表示的是里面可以放T和T的子类;
? super T:代表的是T的超类,因而表示里面可以放T和T的父类!
作者:
钟成军
时间:
2012-6-21 22:53
举一个家族成员例子吧
?extends T :
T代表这个家族的始祖,那么?extends T就是说?只要是T的后代就行,即T的子子孙孙了,它是有上限的
?super T:
T代表这个家族的最小一代,那么?super T就是说?只要是T的前辈就行,即T的爷爷爸爸等,它是有下限的
作者:
崔云飞
时间:
2012-6-21 23:02
建议你把Java中的继承梳理清除,这些概念是很容易理解的
? extends T指的是可以支持T和T的子类;
? super T值得是可以支持T和T的父类
作者:
张华廷
时间:
2012-6-21 23:07
1. <? super T> 表示以T类型为下限的某种类
实例化的时候对象的泛型一定要大于等于T类型(也就是T的父类或自己)
使用的时候类型一定要小雨等于T类型(也就是T的子类或自己)
2. <? extends T> 表示以T类型为上线的某种类
实例化的时候对象的泛型一定要小于等于T类型(也就是T的子类或自己)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Searching {
public static void main(String[] args) {
String[] strings = { "0", "1", "2", "3", "4", "5"};
List<Integer> integers = new ArrayList<Integer>();
for(String s : strings){
integers.add(Integer.valueOf(s));
}
if(integers.get(1)>new Integer(1)){System.out.println("<1>");}
if(integers.get(1)<new Integer(1)){System.out.println("<2>");}
if(integers.get(1)==new Integer(1)){System.out.println("<3>");}
System.out.println(Collections.binarySearch(integers, 1,cmp));
}
static Comparator<Integer> cmp = new Comparator<Integer>(){
public int compare(Integer i,Integer j){
return i<j?-1:(i==j?0:1);
}
};
}
此程序输出:-2
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Searching {
public static void main(String[] args) {
String[] strings = { "0", "1", "2", "3", "4", "5"};
List<Integer> integers = new ArrayList<Integer>();
for(String s : strings){
integers.add(Integer.valueOf(s));
}
if(integers.get(1)>new Integer(1)){System.out.println("<1>");}
if(integers.get(1)<new Integer(1)){System.out.println("<2>");}
if(integers.get(1)==new Integer(1)){System.out.println("<3>");}
System.out.println(Collections.binarySearch(integers, 1,cmp));
}
static Comparator<Integer> cmp = new Comparator<Integer>(){
public int compare(Integer i,Integer j){
return i<j?-1:(i>j?1:0);
}
};
}
此程序输出:1
作者:
韦念欣
时间:
2012-6-22 01:42
泛型的限定我是这样理解的;
? extends T: 可以接收T类型或者T的子类型。限定上限。即T和T的后代都可以接收,其他不行
? super T: 可以接收T类型或者T的父类型。限定下限。即T和T的祖祖辈辈都可以接收,其他不行
作者:
李柏旺
时间:
2012-6-22 13:48
? extends T: ?<T
? super T: ?>T
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2