`
cakin24
  • 浏览: 1389033 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

循序渐进理解泛型的通配符

    博客分类:
  • java
 
阅读更多

一 泛型方法的应用

1 代码示例

import java.util.Vector;

public class RandomGenerObject {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Vector<Integer> v = new Vector<Integer>();
		Vector<Object> v1 = new Vector<Object>();
		//radomMeth(v);             //a处代码
		radomMeth(v1);

	}

	public static void radomMeth(Vector<Object> vector) {
		vector.add("cjg"); //b处代码
		vector.add(156);   //c处代码
		for (Object obj : vector) {
			System.out.println(obj);
		}
	}

}

2 运行结果

cjg
156

3 代码解析

  • 在radomMeth()方法中,对于Vector<Object>泛型,实现了可以向该参数中添加任意类型的对象,例如b处代码和c处代码,这是因为任何对象的基类都是Object类型,所以任何类型的对象都可以自动转换成Object类型。
  • 在具体调用radomMeth()方法时,只要传入的参数为Object类型泛型对象,才会正确运行。如果是其他类型的泛型对象,则会编译出错。这是因为参数化类型无继承性特性。如果把a处代码的注释去掉,就会提示编译出错。

 

二 泛型通配符的应用

1 代码示例

import java.util.Vector;

public class RandomGener {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Vector<Integer> v = new Vector<Integer>();
		v.add(1);
		v.add(2);
		radomMeth(v);
		
		Vector<Object> v1 = new Vector<Object>();
		v1.add("aa");
		v1.add(2.2);
		radomMeth(v1);
	}

	public static void radomMeth(Vector<?> vector) {
		// vector.add("1");      //a处代码
		System.out.println("输出" + vector + "各个成员----------");
		for (Object obj : vector) {
			System.out.println(obj);
		}
		System.out.println("对象的大小" + vector.size());
	}

}

2 运行结果

输出[1, 2]各个成员----------
1
2
对象的大小2
输出[aa, 2.2]各个成员----------
aa
2.2
对象的大小2

3 代码解析

  • 在radomMeth()方法中,通过“?”标识实现接受任何类型参数的方法,即在具体调用该方法时,传入的对象可以是任意类型,例如Integer类型的对象v和Object类型的对象v1。
  • 在radomMeth()方法中,虽然可以接受任意类型的参数,但是具体接受什么类型只有在具体调用方法时才能确定。因此在调用a处代码时,会编译报错。可是如果调用与参数类型无关的方法size(),则不会编译报错。

 

三 通配符的上限和下限的应用

1 代码示例

import java.util.ArrayList;
import java.util.List;

public class IntegrationGener {

	public static void main(String[] args) {
		List<Number> listNums = new ArrayList<Number>();
		listNums.add(1);
		listNums.add(1.23);

		List<Integer> listInteger = new ArrayList<Integer>();
		List<? extends Number> listNums2 = listInteger;
		List<? super Integer> listNums3 = listInteger;
		listNums3.add(7);
		listNums3.add(null);
		System.out.println("listNums3中的元素" + listNums3.get(0));
		System.out.println("listNums3中的元素个数" + listNums3.size());
		System.out.println("listNums2中的元素" + listNums2.get(0));
		System.out.println("listNums2中的元素个数" + listNums2.size());
		listNums3.add(null);
		System.out.println("listNums3中的元素个数" + listNums3.size());
		System.out.println("listNums2中的元素个数" + listNums2.size());
		
		List<Number> listNums1 = new ArrayList<Number>();
		List<? super Integer> listNums4 = listNums1;
		listNums4.add(6);
	}
}

2 运行结果

listNums3中的元素7
listNums3中的元素个数2
listNums2中的元素7
listNums2中的元素个数2
listNums3中的元素个数3
listNums2中的元素个数3

3 代码解析

  • 为了解决泛型参数类型无继承性,出现了extends和super标识符号。List<? extends Number> listNums2表示listNums2对象可以被Number类型的任何子类型对象(List<Integer> listInteger)赋值。List<? super Integer> listNums3表示listNums3对象可以被Integer类型的任何父类(listNums1)或Interger类型对象(listInteger)赋值。
  • 一条比较通用的原则是,如果要向列表中添加元素则用<? super T>,如果要从列表中获取元素则用<? extends T>,如果既要获取又要添加则不使用通配符。
分享到:
评论

相关推荐

    Java泛型通配符

    在处理像Activiti这样的工作流框架时,理解并正确使用泛型通配符尤其重要,因为它们经常涉及到复杂的对象模型和数据操作,确保类型安全可以避免潜在的运行时错误。 总的来说,Java泛型通配符是Java编程中不可或缺的...

    Java 泛型通配符的一个实例

    * 一个参数通配符的实例 * 说明:对一个包含了数值元素的集合进行汇总运算。在这种情况下,用户并不关心 * 集合中的每一个对象是什么类型,只要它是数值型即可,而且,用户也希望集合中可以 * 存放不同类型的数值...

    Java中泛型通配符的使用方法示例

    Java 中泛型通配符的使用方法示例主要介绍了 Java 中泛型通配符的使用方法,结合实例形式分析了 Java 中泛型通配符的功能、语法及在泛型类创建泛型对象中的使用方法。以下是 Java 中泛型通配符的使用方法示例的知识...

    java基础-泛型通配符

    java基础-泛型通配符

    泛型讲解 类型通配符

    "泛型讲解 类型通配符" 泛型是Java语言中的一种机制,它允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致...

    QT019-循序渐进学C#

    《QT019-循序渐进学C#》是一本专门为编程初学者设计的教程,旨在引导读者逐步掌握C#编程语言的核心概念和技术。这本书的PDF格式使得读者可以方便地在电子设备上阅读和查阅,同时其详细的目录和清晰的结构确保了学习...

    一看就懂 详解JAVA泛型通配符T,E,K,V区别

    Java泛型通配符T、E、K、V区别详解 Java泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口...

    泛型实例详解

    在这个“泛型实例详解”中,我们将通过7个具体的实例深入理解泛型的各种应用场景。 1. 普通泛型: 在Java中,我们可以在集合类如List、Set、Map等中使用泛型,以确保存储的数据类型一致。例如,创建一个只存储...

    java泛型常用通配符实例解析

    java泛型常用通配符实例解析 Java泛型是Java 5中引入的一项新特性,可以用来编写泛型代码,使得代码更加灵活和可重用。其中,通配符是泛型中的一种重要概念,本文将详细介绍Java泛型常用通配符实例解析。 1. 限定...

    java中的泛型通配符的使用

    这是小编自己学习的心得,想通过这个平台对大家共享,希望大家前来评价一下,我及时改正,通配符这个是在泛型中使用的一个可以帮助大家更加方便简洁的去利用代码,它是其他泛型的一个总父类!

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

    首先,我们需要理解泛型的基本概念。泛型允许我们在定义集合(如List)时指定元素的类型,确保在编译时期就能捕获类型错误。例如,`List&lt;String&gt;` 只能存储字符串,而 `List&lt;Integer&gt;` 只能存储整数。这样,我们就...

    泛型&通配符常见面试题总结

    泛型和通配符是Java编程中的重要概念,它们在处理类型安全和代码复用方面起着关键作用。本文将深入探讨这两个主题,并提供一些常见的面试题,帮助开发者理解和掌握这些知识点。 首先,我们来理解泛型。泛型是Java 5...

    【循序渐进学.java】从入门到精通.第25讲-泛型.异常.zip

    绝对韩顺平老师的讲解视频!教学文件打包太大,就一个一个的上传了! avi格式的,最好用KMPlayer来播放,下载地址:https://www.kmplayer.com/home 后续还上传,韩顺平老师教学的源代码!

    Visual Studio.NET中文版程序设计培训教程PDF,VB.NET篇,从零起步,快速入门,循序渐进,示例明确丰富.

    "循序渐进"的学习路径确保了读者能够逐步掌握更高级的概念,例如类和对象、继承、多态以及接口。这些面向对象编程的特性使得VB.NET能够构建复杂、可维护的软件系统。此外,教程还会涉及异常处理,帮助开发者写出健壮...

    详谈Java泛型中T和问号(通配符)的区别

    Java泛型中T和问号(通配符)的区别 Java泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、...

    韩顺平.循序渐进学.java.从入门到精通完整版PPT完整版笔记代码

    循序渐进学.java.从入门到精通完整版PPT完整版笔记代码》是一套全面深入学习Java编程语言的资源集合。它包含由知名IT教育专家韩顺平精心编写的PPT教程以及配套的完整版笔记和代码,旨在帮助初学者和有一定基础的...

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

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

    JVM如何理解Java泛型类.doc

    ### JVM如何理解Java泛型类 #### 一、引言 在Java中,泛型是一种强大的功能,它允许程序员编写灵活且类型安全的代码。然而,对于Java虚拟机(JVM)来说,它实际上并不理解泛型的概念。所有的泛型信息在编译阶段就被...

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    本代码资源的目标是帮助读者理解泛型的用法和优势,并通过实际的示例代码加深对泛型的掌握。读者可以通过运行这些示例代码来观察泛型的行为和效果,进一步加深对泛型的理解。 代码资源中会包含以下示例代码: 定义...

    Generic_3(泛型限定(下限)-泛型限定(上限的体现)-泛型限定(下限的体现)-泛型限定(通配符的体现)-集合查阅的技巧)

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...

Global site tag (gtag.js) - Google Analytics