关闭

【java进阶】初探泛型

175人阅读 评论(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
查看评论

夯实JAVA基本之一——泛型详解(2):高级进阶

前言:被温水煮惯了,梦想的东西总是不敢于尝试,失败了又怎样,最多从头来过。上一篇给大家初步讲解了泛型变量的各种应用环境,这篇将更深入的讲解一下有关类型绑定,通配符方面的知识。一、类型绑定1、引入我们重新看上篇写的一个泛型:class Point { private T x; //...
  • harvic880925
  • harvic880925
  • 2015-11-17 10:24
  • 9321

Java之泛型进阶——泛型通配符

主要记录泛型的边界与通配符相关,通配符上限,通配符下限。
  • chenghuaying
  • chenghuaying
  • 2016-03-15 21:21
  • 1552

C#进阶篇---异常、类、接口、数组、泛型

异常处理 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _004_异常处理_案例2 { ...
  • wangyongfei123
  • wangyongfei123
  • 2015-10-08 14:32
  • 273

java泛型初探

1.泛型的理解 java的一个高级用法就是泛型类,基本很多框架都会用泛型去搭建,比如Gson。。。。。泛型真是个好东西,可说是海纳百川了。。。所以作为一个android开发更有必要掌握这个东东 泛型可以设计为一个共有的功能返回不同的类型 泛型可说是一种对类型的约束,也可以说是一种对类型的容纳、...
  • zhongwn
  • zhongwn
  • 2016-10-11 20:36
  • 217

Java泛型初探

泛型是Java SE 5.0中引入的一项特征,自从这项语言特征出现多年来,我相信,几乎所有的Java程序员不仅听说过,而且使用过它。关于Java泛型的教程,免费的,不免费的,有很多。我遇到的最好的教材有: The Java Tutorial Java Generics and C...
  • JieTouLangRen
  • JieTouLangRen
  • 2012-04-15 14:42
  • 792

java 泛型初探

1、 泛型存在的意义: public class Test3 { public static void main(String []args){ List list=new ArrayList(); list.add(“abc”); ...
  • u014257192
  • u014257192
  • 2016-02-26 16:51
  • 148

JAVA进阶4.12——泛型

在学习本章之前,需要对Java的集合(Collection、Map)有一定的基础。 Java集合有一个缺点,就是把一个对象“丢进”集合里后,集合就会“忘记”这个对象的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object类型(其运行时类型没变)。 之所以这样设计是因为设计集合的程序员...
  • QPC908694753
  • QPC908694753
  • 2016-09-20 15:43
  • 155

Java进阶 泛型

Java 进阶
  • GoslingBoy
  • GoslingBoy
  • 2014-08-13 23:37
  • 528

JAVA进阶day08泛型

写这篇博文,我并没有特别大的把握。姑且贴代码做分析。遇到什么知识点分析什么知识点吧。 class Person { private T age; public void setAge(T age) { this.age = age; } p...
  • qq_21435127
  • qq_21435127
  • 2018-02-01 18:39
  • 33

JAVA进阶-泛型

>泛型:泛型指代了参数的类型化类型,一般被用在接口,类,方法中 >作用:用来确定参数的范围,在书写代码的时候提前检查代码的错误性 >泛型的声明,以下给出类声明,依此类推: class ClassName{} class ClassName{} >通用符:一般...
  • qq285016127
  • qq285016127
  • 2014-10-14 18:04
  • 819
    个人资料
    • 访问:92054次
    • 积分:1521
    • 等级:
    • 排名:千里之外
    • 原创:54篇
    • 转载:37篇
    • 译文:0篇
    • 评论:23条
    文章分类
    最新评论