泛型的一点点东西

首先是一个接口,这个接口作为底层的一个标准:

package com.cn.wxwinnie.java.genericity;
/**
 * @author 潇湘暮雨 E-mail:wxwinnie@hotmail.com
 *
 * @version 创建时间:2014年3月13日 上午9:58:12
 *
 */
public interface Animal {
	public String cry();
	public String sleep();
}

 

 

然后接口的两个实现

package com.cn.wxwinnie.java.genericity;
/**
 * @author 潇湘暮雨 E-mail:wxwinnie@hotmail.com
 *
 * @version 创建时间:2014年3月13日 上午9:59:58
 *
 */
public class Cat implements Animal {

	@Override
	public String cry() {
		System.out.println("猫叫");
		return null;
	}

	@Override
	public String sleep() {
		System.out.println("猫睡觉");
		return null;
	}
	
	public String tosString(){
		return "这是一只猫";
	}

}

package com.cn.wxwinnie.java.genericity;
/**
 * @author 潇湘暮雨 E-mail:wxwinnie@hotmail.com
 *
 * @version 创建时间:2014年3月13日 上午9:58:27
 *
 */
public class Dog implements Animal {

	@Override
	public String cry() {
		System.out.println("狗叫");
		return null;
	}

	@Override
	public String sleep() {
		System.out.println("狗睡觉");
		return null;
	}
	public String tosString(){
		return "这是一只狗";
	}
}

 

然后就是这里的重点了,自定义一个泛型的类(其实也就是包含有指定类型)。

package com.cn.wxwinnie.java.genericity;

/**
 * 一个泛型类
 * 
 * @author 潇湘暮雨 E-mail:wxwinnie@hotmail.com
 * 
 * @version 创建时间:2014年3月13日 上午9:56:19
 * 
 */
public class GenericityClass<T extends Animal,V extends Object> {//最主要的就是GenericityClass<T extends Animal,V extends Object>这里的泛型声明。这里的T当然也可以写成其他任意字母,不过推荐大写。然后这里的T和V在声明以后,使用起来就跟使用String,Integer这些类型一样的了。   
	private T ani;
	private V obj;

	public GenericityClass(T ani,V obj) {
		this.ani = ani;
		this.obj = obj;
	}

	public GenericityClass() {}

	public T getAni() {
		return ani;
	}

	public void setAni(T ani) {
		this.ani = ani;
	}

	public V getObj() {
		return obj;
	}

	public void setObj(V obj) {
		this.obj = obj;
	}

	public String getInfo() {
		ani.cry();
		System.out.println(obj.toString());
		return obj.toString();
	}
}


 

然后可以这么测试:
package com.cn.wxwinnie.java.genericity;

/**
 * 泛型测试类
 * 
 * @author 潇湘暮雨 E-mail:wxwinnie@hotmail.com
 * 
 * @version 创建时间:2014年3月13日 上午10:01:16
 * 
 */
public class Test {

	public static void main(String[] args) {
		// 这里新建对象的时候就是使用的泛型创建的。 尖括号中的参数是在定义类的时候定义的。
		GenericityClass<Dog, String> gc = new GenericityClass<Dog, String>();
		gc.setAni(new Dog());
		gc.setObj("O(∩_∩)O哈哈~");
		gc.getInfo();
	}

}

 


从上面可以看出,在创建对象的时候,使用了GenericityClass<Dog, String> 这种形式的类型,因为在定义类的时候就是这么定义的,可以指定两个类型参数,当然也可以指定三个或者四个等,这就是指定泛型内的类型。

例如,像List这种容器泛型public interface List<E> extends Collection<E>,是这么定义的,这里的<E>相当于指定了其中可存储的元素的类型。就像上面的T和V一样,指定了具体的类型,也就只能往里面存储对应的类型及其子类型了。虽然Object也能达到这种类似的功能,但是毕竟Object类型太宽泛,而且什么类型都是Object类型的子类型,如果用到其中的一些方法或函数,就需要类型判断了,不然就会出错,例如上面的getInfo方法,不是所有的类型都有的,只有Animal类型及其子类型才有这个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值