泛型,通配符
(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);
}
分享到:
相关推荐
Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...
接下来,让我们详细讨论 Java 泛型的关键字和通配符。 extends 和 super 的区别 在 Java 泛型中,extends 和 super 是两个重要的关键字,它们分别用于限定类型的上界和下界。 extends 用于限定类型的上界,表示...
Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...
下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`<T>`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...
下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...
通过学习这些知识点,开发者能更好地理解Java泛型的内部原理,以及如何在实际项目中充分利用泛型的特性,提高代码质量和安全性。在这个视频教程中,张孝祥老师将详细讲解这些概念,并通过实例帮助学员深入掌握Java...
SUN公司的Java泛型编程文档,包括英文原版和网络翻译版,为开发者提供了深入理解和熟练运用泛型的重要资源。 首先,泛型的基本概念是允许在定义类、接口和方法时使用类型参数,这样就可以在编译时检查类型安全,...
- 泛型通配符:例如`?`,表示任意类型。`List<?>`表示可以容纳任何类型的列表。 - 上界通配符:`<? extends T>`限制了只能传入T或T的子类类型的对象。 - 下界通配符:`<? super T>`限制了只能传入T或T的父类类型...
Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入。泛型的主要目的是提供类型安全,帮助程序员在编译时发现...在这个"java泛型Demo"中,你将有机会实践这些概念,加深对Java泛型的理解。
Java泛型还支持带有通配符的泛型类型,例如`List<?>`表示未知类型的`List`,这是不可变的。`List<? extends T>`表示`T`类型或其子类型的`List`,而`List<? super T>`表示`T`类型或其父类型的`List`。 使用泛型时,...
通过理解并熟练运用Java泛型,开发者可以编写出更加健壮、类型安全且易于维护的代码,提升软件质量。Java泛型技术的不断发展和完善,也为Java程序员提供了强大的工具来应对复杂的数据处理场景。
本文将深入探讨Java泛型的概念、使用方式以及等价的非泛型实现,帮助读者全面理解这一强大的工具。 首先,泛型允许在类、接口和方法中定义类型参数,使得代码能够在编译时进行类型检查,防止了运行时可能出现的...
本文将深入探讨Java泛型通配符如何解决这一问题。 首先,我们需要理解泛型的基本概念。泛型允许我们在定义集合(如List)时指定元素的类型,确保在编译时期就能捕获类型错误。例如,`List<String>` 只能存储字符串...
本文将深入探讨C#和Java在泛型实现上的异同,帮助开发者更好地理解和利用这两种语言的泛型功能。 首先,我们来看C#中的泛型。C#自2.0版本开始引入泛型,它允许开发者在类、接口和方法中定义类型参数,从而创建可...