`
hacksin
  • 浏览: 10481 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 泛型 通配符理解

    博客分类:
  • Java
阅读更多
泛型,通配符
(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编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    接下来,让我们详细讨论 Java 泛型的关键字和通配符。 extends 和 super 的区别 在 Java 泛型中,extends 和 super 是两个重要的关键字,它们分别用于限定类型的上界和下界。 extends 用于限定类型的上界,表示...

    Java泛型应用实例

    Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...

    java 泛型接口示例

    下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`&lt;T&gt;`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...

    java泛型技术之发展

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和重用性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 1. **发展...

    java 泛型方法使用示例

    下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...

    java泛型的内部原理及更深应用

    通过学习这些知识点,开发者能更好地理解Java泛型的内部原理,以及如何在实际项目中充分利用泛型的特性,提高代码质量和安全性。在这个视频教程中,张孝祥老师将详细讲解这些概念,并通过实例帮助学员深入掌握Java...

    SUN公司Java泛型编程文档

    SUN公司的Java泛型编程文档,包括英文原版和网络翻译版,为开发者提供了深入理解和熟练运用泛型的重要资源。 首先,泛型的基本概念是允许在定义类、接口和方法时使用类型参数,这样就可以在编译时检查类型安全,...

    关于java基础的泛型的练习

    - 泛型通配符:例如`?`,表示任意类型。`List&lt;?&gt;`表示可以容纳任何类型的列表。 - 上界通配符:`&lt;? extends T&gt;`限制了只能传入T或T的子类类型的对象。 - 下界通配符:`&lt;? super T&gt;`限制了只能传入T或T的父类类型...

    java泛型Demo

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入。泛型的主要目的是提供类型安全,帮助程序员在编译时发现...在这个"java泛型Demo"中,你将有机会实践这些概念,加深对Java泛型的理解。

    java泛型深入.pdf

    Java泛型还支持带有通配符的泛型类型,例如`List&lt;?&gt;`表示未知类型的`List`,这是不可变的。`List&lt;? extends T&gt;`表示`T`类型或其子类型的`List`,而`List&lt;? super T&gt;`表示`T`类型或其父类型的`List`。 使用泛型时,...

    Java泛型技术之发展.pdf

    通过理解并熟练运用Java泛型,开发者可以编写出更加健壮、类型安全且易于维护的代码,提升软件质量。Java泛型技术的不断发展和完善,也为Java程序员提供了强大的工具来应对复杂的数据处理场景。

    Java泛型的理解与等价实现

    本文将深入探讨Java泛型的概念、使用方式以及等价的非泛型实现,帮助读者全面理解这一强大的工具。 首先,泛型允许在类、接口和方法中定义类型参数,使得代码能够在编译时进行类型检查,防止了运行时可能出现的...

    浅谈Java泛型通配符解决了泛型的许多诟病(如不能重载)

    本文将深入探讨Java泛型通配符如何解决这一问题。 首先,我们需要理解泛型的基本概念。泛型允许我们在定义集合(如List)时指定元素的类型,确保在编译时期就能捕获类型错误。例如,`List&lt;String&gt;` 只能存储字符串...

    关于C#、java泛型的看法

    本文将深入探讨C#和Java在泛型实现上的异同,帮助开发者更好地理解和利用这两种语言的泛型功能。 首先,我们来看C#中的泛型。C#自2.0版本开始引入泛型,它允许开发者在类、接口和方法中定义类型参数,从而创建可...

Global site tag (gtag.js) - Google Analytics