泛型:jdk1.5后的新特性,用于解决安全问题,是一个安全机制。

好处:

1.将运行时的异常出现问题classcastException。转移到了编译时期。方便程序员调试解决问题,让运行事情问题减少,安全。

2.避免了强制转换

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

在使用Java中,什么时候使用泛型呢?

通常在集合框架中很常见,只要见到<>就要定义泛型,其实<>就是用来接收类型的。

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

如同函数传参数一样。



Comparator<>是一个接口,也可以带泛型,表示指定类型。

//泛型类

什么时候定义泛型类呢?

当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展。现在定义泛型来完成扩展。

class Utils<QQ>{
	private QQ q;
	public void setObject(QQ q){
		this.q=q;
	}
	public QQ getObject(){
		return q;
	}
}

class Tool{
	private Object obj;
	public void setObject(Object obj){
		this.obj=obj;
	}
	public Object getObject(){
		return obj;
	}

}
class GenericDemo3{
	public static void main(String [] args){
		Utils<Worker> u=new Utils<Worker>();
		u.setObject(new Worker());
		Worker w=(Worker) u.getObject();

		/*Tool t=new Tool();
		t.setObject(new getWorker());
		Worker w=(Worker)t.getObject();
		*/
	}
}

/*



*/

泛型方法:

class Demo<T>{//操作对象一建立,对象就固定,这是泛型一个局限性。
	public void show(T t){
		System.out.println("show:"+t);
	}
	public void print(T t){
		System.out.println("print"+t);
	}

}

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

class Demo{
	public <T> void show(T t){
		System.out.println("show:"+t);
	}
	public <Q> void print(Q q){
	//指定任意类型
		System.out.println("print"+q);
	}
	public static <W> void method(W t){//静态方法泛型,是在static方法
		System.out.println("method:"+t);
	}

}
class GenericDemo4{
	public static void main(String [] args){
		/*Demo<Integer> d=new Demo<Integer>();
		d.show(new Integer(4));
		d.print(9)*/
		/*Demo d=new Demo();
		d.show("haha");
		d.show("new Integer(4)");*/
		Demo<String> d=new Demo<Strring>();
		d.show(4);
		d.print(5);
		d.print("lishi");
		Demo.method("hahaha");

	}
}

泛型定义在接口上。

interface Inter<T>{
	void show(T t);
}
//这个是指定String类型的。
class InterImp1 implements Inter<String>{
	public void show(String t){
		System.out.println("show:"+t);
	}
}
//这个是让操作者自己去指定类型的
class GenericDemo5{
	public static void main(String[] args){
		InterImp1 <Integer>=new InterImp1 <Integer>();
		i.show(4);
	}
}
class GenericDemo5(){
	public static void main(){
		InterImp1 i=new InterImp1();
		i.show("haha");

	}
}

? 通配符,也可以理解为占位符

泛型的限定:(高级应用)

?extend E:可以接收E类型或者E的子类,上限

? super E:可以接收E类型或E的父类型。下限

class GenericDemo6{
	public static void main(String [] args){
		ArrayList<String> al=new ArrayList<String>();
		a1.add("abc1");
		a1.add("abc2");
		a1.add("abc3");

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

		/*
		ArrayList<Integer> all=new ArrayList<Integer>();
		all.add(4);
		all.add(7);
		all.add(1);
		printColl(all);*/

		//泛型限定
		ArrayList<Student> all=new ArrayList<student>();
		all.add(new Student("abc--1"));
		all.add(new Student("abc--2"));
		all.add(new Student("abc3--"));
		print(all);
	}
	public static void printColl(ArrayList<? extends Person>){
	//? extends Person表示泛型限定。只能是继承person类及person本身的类。
		Iterator<? extends Person> it=al.iterator();

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

	/*
	public static void printColl(ArrayList<?> al){//当类型不知道时,我们可以用通配符?来表示
		Iterator<?> it=al.iterator();
		while(it.hasNext()){
			System.out.println(it.next());//这里不能调用getlength().因为这是具体类中的方法,不能使用类型具体方法。但是可以使用toString()
		}
	}*/
}

泛型什么用呢?

答:指定具体类型,用<>,凡是<>里面的都能打印。但是只能某一个,

如果用通配符?表示能接收所有的类型

import java.util.*;
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<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 Comp implements Comparator<Person>//比较器。
{
	public int compare(Person p1,Person p2)
	{
		return p2.getName().compareTo(p1.getName());//里面只能用父类的方法。
	}
}

class Person
{
	private String name;
	Person(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return name;
	}
	public String toString()
	{
		return "person :"+name;
	}
}

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

}

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

Java基础----Java---集合框架---泛型、泛型方法、静态方法泛型、泛型接口、泛型限定、泛型类的更多相关文章

  1. Java基础--说集合框架

    版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...

  2. Thinking in java基础之集合框架(转载)

    集合简介(容器)把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成一个东西(一个对象),然后我们借用袋子把这20个苹果装起来,而这个袋子就是集合(也叫 ...

  3. java基础之集合框架

    6.集合框架: (1)为什么出现集合类? 面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储. 集合就是存储对象最常用的一种方式. (2)数组和集合都是容器,两者有何不同 ...

  4. 黑马程序员——【Java基础】——集合框架

    ---------- android培训.java培训.期待与您交流! ---------- 一.集合框架概述 (一)集合框架中集合类关系简化图 (二)为什么出现集合类? 面向对象语言对事物的体现都是 ...

  5. java基础之集合框架--使用ArrayList类动态 存储数据

    一.ArrayList是List接口下的一个实现类,实现了长度可变的.连续的数组:拥有数组的特性. 遵循了LIst的规则:不唯一的.有序的. 如果没有增加泛型的话,集合中可以添加任何类型的数据. 使用 ...

  6. java基础37 集合框架工具类Collections和数组操作工具类Arrays

    一.集合框架工具类:Collections 1.1.Collections类的特点 该工具类中所有的方法都是静态的 1.2.Collections类的常用方法 binarySearch(List< ...

  7. Java基础之集合框架(Collection接口和List接口)

    首先我们说说集合有什么作用. 一.集合的作用 1.在类的内部,对数据进行组织: 2.简单而快速的搜索大数量的条目: 3.有的集合接口,提供一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关 ...

  8. Java基础之集合框架类及泛型简介

    Collection接口 Collection 通用的常见方法 add()添加一个元素,可以指定脚标 addAll()将一个collection放入 clear()清除 remove()删除元素,返回 ...

  9. Java基础之集合框架——使用集合Vector<>挑选演员(TryVector)

    控制台程序. public class Person implements Comparable<Person> { // Constructor public Person(String ...

  10. Java基础之集合框架——使用堆栈Stack<>对象模拟发牌(TryDeal)

    控制台程序. public enum Rank { TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, A ...

随机推荐

  1. hdu5652 India and China Origins(并查集)

    India and China Origins  Accepts: 49  Submissions: 426  Time Limit: 2000/2000 MS (Java/Others)  Memo ...

  2. MQ(消息队列)常见的应用场景解析

    前言 提高系统性能首先考虑的是数据库的优化,之前一篇文章<数据库的使用你可能忽略了这些>中有提到过开发中,针对数据库需要注意的事项.但是数据库因为历史原因,横向扩展是一件非常复杂的工程,所 ...

  3. 如何理解主函数main中变量(int argc,char *argv[])的含义

    每一个C语言的初学者,都会注意到主函数main()里的两个参数,但是初学者一般不会去关注这两个参数的具体作用,下面我们就来介绍这两个参数的具体作用. main()函数是控制台程序的入口,int mai ...

  4. Python中的文件路径的分隔符

    主要是需要考虑分隔符的问题: 在Windows系统下的分隔符是:\ (反斜杠). 在Linux系统下的分隔符是:/(斜杠). 当在字符中出现\时,大家就要考虑到转义字符了. 转义字符的概念,参考维基百 ...

  5. python2.7入门---变量类型

      这篇文章呢,主要是用来记录python中的变量类型学习内容的.接下来就来看一下变量类型,那么什么是变量呢.变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解 ...

  6. selenium常用内容

    一.声明浏览器对象 注意点一,Python文件名或者包名不要命名为selenium,会导致无法导入 from selenium import webdriver #webdriver可以认为是浏览器的 ...

  7. Mysql索引介绍及常见索引的区别

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  8. 项目中BigDecimal与Double使用场景

    金额要用BigDecimal 金额计算不能用doube!!!! 金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别.先看一个小例子: 请看题: 示例1 问, ...

  9. PAT-013 L1-013. 计算阶乘和

    L1-013. 计算阶乘和 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对于给定的正整数N,需要你计算 S = 1! + 2 ...

  10. iOS开发-文件管理

    iOS学习笔记(十七)--文件操作(NSFileManager) 浅析 RunLoop 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled iOS开发--Swift篇&a ...