关闭

【java进阶】初探泛型

141人阅读 评论(0) 收藏 举报
分类:

什么是泛型

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单 来源:百度百科


一个泛型的例子

	List<String> list = new ArrayList<String>();

泛型有什么作用

通过泛型可以约束编译时的类型 如同上面的例子一样 在使用add方法的时候只能添加对应得 String类型 同样在使用get方法时获得的对象类型也是String  这样可以让我们在编码的时候 就不需要做类型转换 及时发现编码时的错误 可以让我们在使用时动态的指定类型而不必出现一个新类型创建一个与之对应的新类

泛型出现的动机

有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。——《Java编程思想 (第4版)》

更多泛型的例子

泛型类

容器类应该算得上最具重用性的类库之一 先看看没有泛型情况下的容器类

public class Container {
	
	private String key;
	
	private String value;
	
	public Container(String key, String value){
		this.key = key;
		this.value = value;
	}

	public String getKey() {
		return key;
	}

	public void setKey(String key) {
		this.key = key;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}
	

}

通过这个例子我们可以看出 key 与 value的类型都是String 如果我们想要使用一个 Integer-Integer 类型key-value  需要定义一个新的类 想要一个String-Integer类型key-value 需要定义一个新的类 有没有什么好的方法可以更优雅的解决这个问题呢?

也许你已经猜到了可以使用Object来替代String 在Java SE5之前我们也只能这么做 但是还是指定了对应得类型 只不过是所有类的基类 有没有什么跟优雅的方式解决呢  于是泛型的出现让我们可以用跟优雅的方式解决这个问题

看看使用泛型后的例子

public class Container<K,V> {
	
	private K key;
	
	private V value;
	
	public Container(K key, V value){
		this.key = key;
		this.value = value;
	}

	/**省略get/set**/
	

}

	public static void main(String[] args) {
		Container<String, Integer> s1 = new Container<String, Integer>("456", 456);
		Container<String, String> s2 = new Container<String, String>("456", "456");
	}

于是乎问题得到了优雅的解决 

泛型接口

最好的例子就是对数据库的crud操作

public interface CrudDao<T> {

	T get(String id);
	
	Integer Insert(T t);
	
}


public class ICrudDao implements CrudDao<Fruit>{

	@Override
	public Fruit get(String id) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Integer Insert(Fruit t) {
		// TODO Auto-generated method stub
		return null;
	}

}


如果使用mybaits我们可以这样写

public interface FruitDao extends CrudDao<Fruit>{

}

泛型方法

一个基本的原则是:无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛化,那么应该有限采用泛型方法。下面来看一个简单的泛型方法的定义:

	private static<T> void print(T t){
		System.out.println(t.getClass().getSimpleName() + ":" + t);
	}
	
	public static void main(String[] args) {
		print("456");
		print(456);
	}


运行结果:

String:456
Integer:456

最后在让我们配合可变参数来完成一个可变参数的泛型方法

	private static<T> void print(T... ts){
		for (T t : ts) {
			System.out.println(t.getClass().getSimpleName() + ":" + t);
		}
		
	}
	
	public static void main(String[] args) {
		print("456", 456, true);
	}

运行结果:

String:456
Integer:456
Boolean:true

总结: 


在我理解看来泛型的最大好处就是提高了代码的复用率 可以让我们将拷贝降到最低 大大提升我们开发速度


初探泛型告一段落 稍后会写一篇关于泛型参数的界限



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:73742次
    • 积分:1319
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:36篇
    • 译文:0篇
    • 评论:19条
    文章分类
    最新评论