`

基础——泛型小知识0527

 
阅读更多
package cn.mmc.day15;

import java.util.*;

/*
泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。

好处
1.将运行时期出现问题ClassCastException,转移到了编译时期。,
	方便于程序员解决问题。让运行时问题减少,安全。,

2,避免了强制转换麻烦。


泛型格式:通过<>来定义要操作的引用数据类型。

在使用java提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见,
只要见到<>就要定义泛型。

其实<> 就是用来接收类型的。

当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。





*/
public class GenericTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ArrayList<String> al = new ArrayList<String>();

		al.add("abc01");
		al.add("abc0991");
		al.add("abc014");

		//al.add(4);//al.add(new Integer(4));//如果没有<String>限定则,这两句编译时不报错,会在运行时报错
		

		Iterator<String> it = al.iterator();
		while(it.hasNext())
		{
			String s = it.next();

			System.out.println(s+":"+s.length());
		}
	}

}
/*----------------------------------------------------------------------*/

/*
class Demo<T>
{
	public void show(T t)
	{
		System.out.println("show:"+t);
	}
	public void print(T t)
	{
		System.out.println("show:"+t);
	}

}
*/

//泛型类定义的泛型,在整个类中有效。如果被方法使用,
//那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
//
//为了让不同方法可以操作不同类型,而且类型还不确定。
//那么可以将泛型定义在方法上。


/*
特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

*/

//1.泛型定义在类上,在整个类上有效。
//如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了

class Demo<T>
{
	public  void show(T t)
	{
		System.out.println("show:"+t);
	}
	//2.泛型定义在方法上,(为了让不同方法可以操作不同类型,而且类型还不确定。)例如:打印输出不同类型的数据
	public <Q> void print(Q q)
	{
		System.out.println("print:"+q);
	}
	//3.静态方法不可以访问类上定义的泛型。如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
	public  static <W> void method(W t)
	{
		System.out.println("method:"+t);
	}
}
class GenericDemo4 
{
	public static void main(String[] args) 
	{
		Demo <String> d = new Demo<String>();
		d.show("haha");
		//d.show(4);
		d.print(5);
		d.print("hehe");

		Demo.method("hahahahha");

		/*
		Demo d = new Demo();
		d.show("haha");
		d.show(new Integer(4));
		d.print("heihei");
		*/
		/*
		Demo<Integer> d = new Demo<Integer>();

		d.show(new Integer(4));
		d.print("hah");

		Demo<String> d1 = new Demo<String>();
		d1.print("haha");
		d1.show(5);
		*/
	}
}
/*----------------------------------------------------------------------*/
//泛型定义在接口上。
interface Inter<T>
{
	void show(T t);
}

/*
class InterImpl implements Inter<String>
{
	public void show(String t)
	{
		System.out.println("show :"+t);
	}
}

*/

class InterImpl<T> implements Inter<T>
{
	public void show(T t)
	{
		System.out.println("show :"+t);
	}
}
class GenericDemo5 
{
	public static void main(String[] args) 
	{

		InterImpl<Integer> i = new InterImpl<Integer>();
		i.show(4);
		//InterImpl i = new InterImpl();
		//i.show("haha");
	}
}

/*----------------------------------------------------------------------*/
/*
? 通配符。也可以理解为占位符。
泛型的限定;
? extends E: 可以接收E类型或者E的子类型。上限。
? super E: 可以接收E类型或者E的父类型。下限

*/
class  GenericDemo6
{
	public static void main(String[] args) 
	{
		/*没有使用方法重用
		ArrayList<String> al = new ArrayList<String>();

		al.add("abc1");
		al.add("abc2");
		al.add("abc3");

		ArrayList<Integer> al1 = new ArrayList<Integer>();
		al1.add(4);
		al1.add(7);
		al1.add(1);

		printColl(al);
		printColl(al1);
		*/

		ArrayList<Person> al = new ArrayList<Person>();
		al.add(new Person("abc1"));
		al.add(new Person("abc2"));
		al.add(new Person("abc3"));
		//printColl(al);

		ArrayList<Student> al1 = new ArrayList<Student>();
		al1.add(new Student("abc--1"));
		al1.add(new Student("abc--2"));
		al1.add(new Student("abc--3"));
		printColl(al1);  //使用方法重用后

	}
	//? extends E: 可以接收E类型或者E的子类型
	public static void printColl(Collection<? extends Person> al)
	{
		Iterator<? extends Person> it = al.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next().getName());
		}
	}
	/*
	public static void printColl(ArrayList<?> al)//方法重用前,ArrayList al = new ArrayList<Integer>();error//左右类型不匹配
	{
		Iterator<?> it = al.iterator();


		while(it.hasNext())
		{
			System.out.println(it.next().toString());
		}
	}
	*/
}

class Person
{
	private String name;
	Person(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return name;
	}
}

class Student extends Person
{
	Student(String name)
	{
		super(name);
	}

}


//<? super E>比较器使用代码复用后
class Comp implements Comparator<Person>
{
	public int compare(Person s1,Person s2)
	{

		//Person s1 = new Student("abc1");
		return s1.getName().compareTo(s2.getName());
	}
}

//TreeSet<Student> ts = new TreeSet<Student>(new Comp());
//ts.add(new Student("abc1"));
//ts.add(new Student("abc2"));
//ts.add(new Student("abc3"));


/*----------------------------------------------------------------------*/
class GenericDemo7 
{
	public static void main(String[] args) 
	{
		
		TreeSet<Student> ts = new TreeSet<Student>(new Comp());

		ts.add(new Student("abc03"));
		ts.add(new Student("abc02"));
		ts.add(new Student("abc06"));
		ts.add(new Student("abc01"));
		
		Iterator<Student> it = ts.iterator();

		while(it.hasNext())
		{
			System.out.println(it.next().getName());
		}
		/**/


		//TreeSet集合的构造方法里面有个参数是<? super E>这种形式的
		TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());

		ts1.add(new Worker("wabc--03"));
		ts1.add(new Worker("wabc--02"));
		ts1.add(new Worker("wabc--06"));
		ts1.add(new Worker("wabc--01"));


		Iterator<Worker> it1 = ts1.iterator();

		while(it1.hasNext())
		{
			System.out.println(it1.next().getName());
		}
	}
}
//比较器,没有使用方法重用前
/*
class StuComp implements Comparator<Student>
{
	public int compare(Student s1,Student s2)
	{
		return s1.getName().compareTo(s2.getName());
	}
}

class WorkerComp implements Comparator<Worker>
{
	public int compare(Worker s1,Worker s2)
	{
		return s1.getName().compareTo(s2.getName());
	}
}
*/

class Worker extends Person
{
	Worker(String name)
	{
		super(name);
	}
}
/*----------------------------------------------------------------------*/

/*----------------------------------------------------------------------*/
分享到:
评论

相关推荐

    清华妹子的Java仓库(进阶学习路线)

    Java基础学习(3)——泛型 Java基础学习(4)——动态代理 《Java多线程核心技术》读书笔记 JDK源码 Java集合框架源码解读(1)——ArrayList、LinkedList和Vector Java集合框架源码解读(2)——HashMap Java集合框架...

    Java典型模块

    15.3 知识点扩展——JSlider和Timer组件的基础知识 15.3.1 使用JSlider组件创建无刻度的滑杆 15.3.2 使用JSlider组件创建带数字刻度的滑杆 15.3.3 使用JSlider组件创建带字符刻度的滑杆 15.3.4 JSlider组件的高级...

    C#全能速查宝典

    1.1.10 泛型——处理算法和数据结构 11 1.1.11 分部类——将一个类分成几部分 12 1.1.12 is操作符——检查变量是否为指定的类型 14 1.1.13 lock关键字——锁定 15 1.1.14 namespace关键字——定义命名空间 15 1.1.15...

    八股文知识点汇总——Java面试题指南

    Java集合/泛型面试题 Java异常面试题 Java中的IO与NIO面试题 Java反射面试题 Java序列化面试题 Java注解面试题 多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 Spring面试题 ...

    精通VISUAL C# 2008:语言基础、数据库系统开发、WEB开发.part4.rar

    第2篇介绍了Windows窗体编程内容,同时包含了C#较高级的编程知识(如反射、泛型等);第3篇以SQL Server2005为例讲解了ADO.NET数据库编程技术;第4篇介绍ASP.NET Web应用程序开发;第5篇介绍.NET 3.5最新技术,包括...

    精通VISUAL C# 2008:语言基础、数据库系统开发、WEB开发.part1.rar

    第2篇介绍了Windows窗体编程内容,同时包含了C#较高级的编程知识(如反射、泛型等);第3篇以SQL Server2005为例讲解了ADO.NET数据库编程技术;第4篇介绍ASP.NET Web应用程序开发;第5篇介绍.NET 3.5最新技术,包括...

    精通VISUAL C# 2008:语言基础、数据库系统开发、WEB开发.part5.rar

    第2篇介绍了Windows窗体编程内容,同时包含了C#较高级的编程知识(如反射、泛型等);第3篇以SQL Server2005为例讲解了ADO.NET数据库编程技术;第4篇介绍ASP.NET Web应用程序开发;第5篇介绍.NET 3.5最新技术,包括...

    精通VISUAL C# 2008:语言基础、数据库系统开发、WEB开发.part3.rar

    第2篇介绍了Windows窗体编程内容,同时包含了C#较高级的编程知识(如反射、泛型等);第3篇以SQL Server2005为例讲解了ADO.NET数据库编程技术;第4篇介绍ASP.NET Web应用程序开发;第5篇介绍.NET 3.5最新技术,包括...

    精通VISUAL C# 2008:语言基础、数据库系统开发、WEB开发.part2.rar

    第2篇介绍了Windows窗体编程内容,同时包含了C#较高级的编程知识(如反射、泛型等);第3篇以SQL Server2005为例讲解了ADO.NET数据库编程技术;第4篇介绍ASP.NET Web应用程序开发;第5篇介绍.NET 3.5最新技术,包括...

    C#6.0学习笔记——从第一行C#代码到第一个项目设计(第一个包)

    开发环境搭建、语法基础、面向对象编程、类型转换、字符串处理与数学运算、控制台应用程序、变体的应用、集合与泛型、调试与单元测试、Lambda表达式、LINQ查询语句、Windows窗体应用程序、WPF基础知识、多线程与...

    C#6.0学习笔记——从第一行C#代码到第一个项目设计(第二个包)

    开发环境搭建、语法基础、面向对象编程、类型转换、字符串处理与数学运算、控制台应用程序、变体的应用、集合与泛型、调试与单元测试、Lambda表达式、LINQ查询语句、Windows窗体应用程序、WPF基础知识、多线程与...

    Head First Java——orel.rar

    此书是根据学习理论所设计的,让你可以从学习程序语言的基础开始一直到包括线程、网络与分布式程序等项目。最重要的,你会学会如何像个面向对象开发者一样去思考。 而且不只是读死书,你还会玩游戏、拼图、解谜题...

    JAVA 核心技术基础篇1

    对于想将Java应用于实际项目中的程序员来说,《Java核心技术——基础知识》修订版是一本权威性的指导书籍。 对于Java SE 6平台的全部更新,这本实用的教程和可靠的参考书通过大量测试过的示例说明了最重要的语言...

    国际大学生程序设计竞赛指南-ACM程序设计

    《ACM程序设计》详细讲解了ACM国际大学生程序设计竞赛(ACM/ICPC)编程、调试方法,以及提高时间、空间性能的策略,并充分利用了c++泛型编程的高效率、规范化的特性,全部采用c++泛型编程。 第1章讲解了ACM程序设计...

    .NET之美:.NET关键技术深入分析

    2.2.3使用泛型的一个小技巧 2.3本章小结 第3章C#中的委托和事件 3.1理解委托 3.1.1 将方法作为方法的参数 3.1.2将方法绑定到委托 3.1.3委托与接口 3.2事件的由来 3.2.1 更好的封装性 3.2.2 限制类型能力 ...

    asp.net知识库

    翻译MSDN文章 —— 泛型FAQ:最佳实践 Visual C# 3.0 新特性概览 C# 2.0会给我们带来什么 泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 Attributes in C# 手痒痒,也来个c# 2.0 object ...

    javaSE代码实例

    第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档注释 13 2.2 基本数据类型 14 2.2.1 整型 15 2.2.2 浮点型 17 2.2.3 char型 17...

    轻松学C#(图解版)

    第三篇是应用技术篇,主要介绍的是异常处理、文件和流、委托、事件、Lambda表达式、命名空间、预处理器、程序集、运行时类型标识、反射、特性、泛型、LINQ和数据库开发等。 =======================================...

Global site tag (gtag.js) - Google Analytics