针对泛型的一些想法和思考

泛型是在java1.5后新加入的东西,这块内容使得java的封装性能更加强大,使用的时候也更加方便。但是这块内容又是比较难以理解的,基于此做此文记录自己的学习心得。

泛型,具体的来说就是将java中操作的数据类型"参数化",使得我们在使用的时候可以把数据类型当成是一个参数,像普通的方式似的进行操作。这些应用很广泛,这种参数类型可以使用在类、接口以及方法定义中。

明确一下几点:

1.为什么使用泛型?

没有泛型的时候,我们通过object对象对多种数据类型就行转换和操作,多数为强制类型转换。但是,这个前提是开发者对于自己的方法中定义的数据类型是确定的情况下的。假若使用同一项目组的其他成员的方法就可能出现对于数据类型不正确或者不明确的情况,这时候就会有运行报错,但是一般不会有编译错误。而有泛型的时候是:使用泛型的好处在于,它在编译的时候进行类型安全检查,并且在运行时所有的转换都是强制的,隐式的,大大提高了代码的重用率。

2.简单的使用场景。

public class getFloat {
   private Float testfoalt;
public Float getTestfoalt() {
return testfoalt;
}
public void setTestfoalt(Float testfoalt) {
this.testfoalt = testfoalt;
}
}

public class getDouble {
   private Double testdouble;
public Double getTestdouble() {
return testdouble;
}
public void setTestdouble(Double testdouble) {
this.testdouble = testdouble;
}
}

使用泛型后代码可以简介的写为:

public class getDouble<T> {
private T myobj;
public T getMyobj() {
return myobj;
}
public void setMyobj(T myobj) {
this.myobj = myobj;
}
}

调用方法:

getDouble<String> myobj=new getDouble<String>();
myobj.setMyobj("hello world");

2.1、<T>是泛型的标记,当然可以使用别的名字,比如。使用<T>声明一个泛型的引用,从而可以在class、方法及接口中使用它进行数据定义,参数传递。

2.2、<T>在声明的时候相当于一个有意义的数据类型,编译过程中不会发生错误;在实例化时,将其用一个具体的数据类型进行替代,从而就可以满足不用需求。

3.规则和使用注意事项:

3.1、泛型的参数类型只能是引用类型,而不能是简单类型。

      比如,<int>是不可使用的。

3.2、可以声明多个泛型参数类型,比如<T, P,Q…>,同时还可以嵌套泛型,例如:<List<String>>

3.3、泛型的参数类型可以使用extends语句,例如<T extends superclass>。

3.4、泛型的参数类型可以使用super语句,例如< T super childclass>。

3.5、泛型还可以使用通配符,例如<? extends ArrayList>

4.扩展功能的注意事项

4.1、extends语句

使用extends语句将限制泛型参数的适用范围。例如:

<T extends collection> ,则表示该泛型参数的使用范围是所有实现了collection接口的calss。如果传入一个<String>则程序编译出错。

4.2、super语句

super语句的作用与extends一样,都是限制泛型参数的适用范围。区别在于,super是限制泛型参数只能是指定该class的上层父类。

例如<T super List>,表示该泛型参数只能是List和List的上层父类。

4.3、通配符

使用通配符的目的是为了解决泛型参数被限制死了不能动态根据实例来确定的缺点。

举个例子:public class SampleClass < T extends S> {…}

假如A,B,C,…Z这26个class都实现了S接口。我们使用时需要使用到这26个class类型的泛型参数。那实例化的时候怎么办呢?依次写下

SampleClass<A> a = new SampleClass();

SampleClass<B> a = new SampleClass();

SampleClass<Z> a = new SampleClass();

这显然很冗余,还不如使用Object而不使用泛型,呵呵,是吧?

别着急,咱们使用通配符,就OK了。

SampleClass<? Extends S> sc = new SampleClass();


感谢点滴在心头大大对于部分例子的借鉴。

猜你喜欢

转载自blog.csdn.net/learn_zhangk/article/details/61920567