牛耳教育十六年专注长沙java培训,是湖南最专业的长沙java培训学校。也是中国十大品牌IT教育机构,16年来总共培养了28000名软件工程师。
电话:0731-82221222


java培训基础——泛型学习

   每次看开源的代码,都会有大量的使用泛型。最近在学习hadoop,里面泛型用的相当多。于是重新看了下java培训基础---泛型的相关知识。

先看一个简单的例子


Source code

package com.bobohe.learn1;

 

public class GetObj<T> {

private T myObj;

 

public T getObj() {

return myObj;

}

 

public void setObj(T obj) {

myObj = obj;

}

 

public static void main(String[] args) {

GetObj<String> strObj = new GetObj<String>();

strObj.setObj("Hello Nissay");

System.out.println(strObj.getObj());

 

GetObj<Double> douObj = new GetObj<Double>();

douObj.setObj(new Double("116023"));

System.out.println(douObj.getObj());

}

}


从这例子可以看出。在实例化的时候<T>中的T将会被一个具体的数据类型所代替,这给我们编程提供了很大的帮助。在hadoop中的Mapper就使用了泛型public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>,还有jdk中的容器类也使用的泛型,当然还有很多其他地方会用到泛型。


为什么要使用泛型呢


在以往的J2SE1.5之前,没有泛型,通常是使用Object类型来进行多种类型数据的操作。这个时候操作最多的就是针对该Object进行数据的强制转换,而这种转换是基于开发者对该数据类型明确的情况下进行的(比如将Object型转换为String型)。倘若类型不一致,编译器在编译过程中不会报错,但在运行时会出错。


如果使用泛型,在编译的时候就会进行类型安全检查,并且在运行时所有的转换都是强制的,隐式的,大大提高了代码的重用率。


泛型的规则和限制


1、泛型的参数类型只能是类(class)类型,而不能是简单类型。比如,<int>是不可使用的。


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


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


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


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


extends,super,通配符的使用


1、extends语句


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


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


2、super语句


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


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


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();



评论

© 牛耳教育|长沙java培训|长沙java培训学校|长沙软件培 | Powered by LOFTER