0217-泛型

1、泛型的定义

1.1 泛型类/泛型接口:

类名后带“<T>”,其中T是类型占位符,可自定义。

1.2 泛型方法

在方法返回值前加上"<T>",

public class FanXinDemo
{
	public static void main(String[] args)
	{
		FanXinDemo a=new FanXinDemo();
		Integer[] array={1,2,3};
		a.printArray(array);

		Box<String> c=new Box<>();
		c.getNum("你好");
	}
	public <T> void printArray(T[] array)
	{
		System.out.println(array[1]);
	}
}

class Box<T>
{
	T b;
	public void getNum(T b)
	{
		this.b=b;
		System.out.println(b);
	}
}
//输出 2 
//你好

 注意,java的泛型不支持基本数据类型,支持String类和包装类

2、泛型的作用

2.1 数据类型参数化

即数据类型如String、Integer用类型占位符T代替。在定义类、接口、方法时先不定义具体的数据类型,待到使用时再定义。

2.2 类型安全

泛型就相当于给代码贴标签。有泛型之前,集合、数组里什么类型的数据都能装,但是在取出时要面临类型转换的问题,容易出错,比如存进去一个字符串“小狗”,又存一个整数200,按索引取数据时对应数据的类型容易填错导致报错。

3. 泛型类和普通类

3.1 首先看创建泛型类的实例

class MyStack<T>
{
	private static final int STACK_CAPACITY=3;
	private T[] myStack;
	int top;							//栈顶索引
	// int size;						

	@SuppressWarnings("unchecked")
	public MyStack()
	{
		myStack=(T[]) new Object[STACK_CAPACITY];
		// myStack[++top]=data;
		top=-1;

	}

	public void push(T data)			//入栈
	{
		if(top==myStack.length-1)
		{
			// throw new IndexOutOfBoundsException("栈已满,无可进空间");
			resize(2*STACK_CAPACITY);
		}
		myStack[++top]=data;
	}

	public T pop()						//出栈
	{
		if(top==-1)
		{
			throw new IndexOutOfBoundsException("栈已空,无可出元素");
		}
		T peek=myStack[top];
		myStack[top--]=null;
		if(top>0 && top==myStack.length/4)
		{
			resize(myStack.length/2);
		}
		return peek;
	}

	public int getSize()				//获取栈元素数量
	{
		return top+1;
	}

	public T getElement()				//获取栈顶元素
	{
		if(top==-1)
		{
			throw new IndexOutOfBoundsException("栈已空,无可出元素");
		}
		return myStack[top];
	}

	@SuppressWarnings("unchecked")		//注解抑制在创建泛型数组时的java警告
										//也可以使用ArrayList,支持泛型类,同时也是java的动态数组
	public void resize(int capacity)
	{
		if(capacity>STACK_CAPACITY)
		{
			T[] newStack=(T[]) new Object[capacity];
			for(int i=0;i<top;i++)
			{
				newStack[i]=myStack[i];
			}
			myStack=newStack;
		}
		else
		{
			System.out.println("输入大小不合法:小于原来容量");
		}
	}
}

 3.2 创建普通类的实例

class person
{
	String name;
	int age;
	public person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public String talk()
	{
		return "我是:"+this.name+",今年"+this.age+"岁了。";
	}
}

 前者在声明的属性类型(引用类型)、构造函数(是使用new关键字创建数组)是最大的不同。

4. 有关问题

4.1 关于<>时有时无

public Node(T data)
	{
		this.data=data;
		this.next=null;
	}

Node<T> newNode = new Node<>(data);

 为什么构造函数里Node(T data)没有<>,然而在实例化时又带上了<>?

java语法规范:在类的内部成员里(比如构造函数、方法),<T>可以不带,因为泛型参数已经在泛型类定义的时候声明了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值