首先是一个接口,这个接口作为底层的一个标准:
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类型及其子类型才有这个方法。