Java 泛型 通配符理解
程序员文章站
2022-07-10 10:46:38
...
泛型,通配符
(1)
传参时要求类型为B,那么可以传入B或B的子类型
获取返回值时,如果返回的类型是B,那么接收他的类型可以是B或者B的父类型。
(2)
<? extends T>表示其定义的泛型范围为T及其子类型
<? super T>表示其定义的泛型范围为T及其父类型
(3)
object是所有类的父类,NULL代表所有类型
(4)举例:
设:B extends A, C extends B
List<? extends B> list = new ArrayList<B>();//表示list存放的是B或者B的子类。
//list.add(new A());//由于定义了list存放的是B或B的子类,所以不能传入其父类A
//list.add(new B()); //由于定义的范围是B或B的子类,但没有明确到底是B还是子类C还是其他新定义的子类,所以编译器无法比较传入的类与定义的类的父子关系,故报错。
//list.add(new C()): //理由同上
//list.add(new Object()); //所有类的父类必然传不进去了
list.add(null); //null代表所有类型,故编译器允许其传入。
A a = list.get(0); //子类可以赋值给父类
B b = list.get(0); //子类可以赋值给父类
//C c = list.get(0); //由于list里面可以存放B类型,所以父类是无法赋值给子类的。
Object o = list.get(0); //子类可以赋值给父类
List<? super B> list = new ArrayList<B>();//表示list存放的是B或B的父类
//list.add(new A()); //由于A是B的父类,单list只接收B或B的子类,故报错
list.add(new B()); //成功
list.add(new c());//成功
list.add(null);//成功
//list.add(new Object());//Object是所有类的父类,必然失败了
//A a = list.get(0); //由于list存放的是B或B的父类,有可能是Object,因父类是无法赋值给子类,故报错
//B b = list.get(0); //同样的道理,如果list存放Object类型就报错了
//C c = list.get(0);//依然是父类无法给子类赋值
Object o = list.get(0);//成功,Object没有父类了
代码:
public void test()
{
ArrayList<? extends B> list = new ArrayList<B>();
A a = new A();
B b = new B();
C c = new C();
Object o = new Object();
// list.add(o);
// list.add(a);
// list.add(b);
// list.add(c);
list.add(null);
o=list.get(0);
a=list.get(0);
b=list.get(0);
// c=list.get(0);
}
public void test()
{
ArrayList<? super B> list = new ArrayList<B>();
A a = new A();
B b = new B();
C c = new C();
Object o = new Object();
// list.add(o);
// list.add(a);
list.add(b);
list.add(c);
list.add(null);
o=list.get(0);
// a=list.get(0);
// b=list.get(0);
// c=list.get(0);
}
(1)
传参时要求类型为B,那么可以传入B或B的子类型
获取返回值时,如果返回的类型是B,那么接收他的类型可以是B或者B的父类型。
(2)
<? extends T>表示其定义的泛型范围为T及其子类型
<? super T>表示其定义的泛型范围为T及其父类型
(3)
object是所有类的父类,NULL代表所有类型
(4)举例:
设:B extends A, C extends B
List<? extends B> list = new ArrayList<B>();//表示list存放的是B或者B的子类。
//list.add(new A());//由于定义了list存放的是B或B的子类,所以不能传入其父类A
//list.add(new B()); //由于定义的范围是B或B的子类,但没有明确到底是B还是子类C还是其他新定义的子类,所以编译器无法比较传入的类与定义的类的父子关系,故报错。
//list.add(new C()): //理由同上
//list.add(new Object()); //所有类的父类必然传不进去了
list.add(null); //null代表所有类型,故编译器允许其传入。
A a = list.get(0); //子类可以赋值给父类
B b = list.get(0); //子类可以赋值给父类
//C c = list.get(0); //由于list里面可以存放B类型,所以父类是无法赋值给子类的。
Object o = list.get(0); //子类可以赋值给父类
List<? super B> list = new ArrayList<B>();//表示list存放的是B或B的父类
//list.add(new A()); //由于A是B的父类,单list只接收B或B的子类,故报错
list.add(new B()); //成功
list.add(new c());//成功
list.add(null);//成功
//list.add(new Object());//Object是所有类的父类,必然失败了
//A a = list.get(0); //由于list存放的是B或B的父类,有可能是Object,因父类是无法赋值给子类,故报错
//B b = list.get(0); //同样的道理,如果list存放Object类型就报错了
//C c = list.get(0);//依然是父类无法给子类赋值
Object o = list.get(0);//成功,Object没有父类了
代码:
public void test()
{
ArrayList<? extends B> list = new ArrayList<B>();
A a = new A();
B b = new B();
C c = new C();
Object o = new Object();
// list.add(o);
// list.add(a);
// list.add(b);
// list.add(c);
list.add(null);
o=list.get(0);
a=list.get(0);
b=list.get(0);
// c=list.get(0);
}
public void test()
{
ArrayList<? super B> list = new ArrayList<B>();
A a = new A();
B b = new B();
C c = new C();
Object o = new Object();
// list.add(o);
// list.add(a);
list.add(b);
list.add(c);
list.add(null);
o=list.get(0);
// a=list.get(0);
// b=list.get(0);
// c=list.get(0);
}
上一篇: spring的bean实例化时间
下一篇: flex如何通过类名称实例化对象