java 之 泛型

来源:互联网 发布:阿里云系统机顶盒root 编辑:程序博客网 时间:2024/05/24 08:33

1.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简。

public class Holder<T> {
private T a;
public Holder(T a){
this.a = a;
}
public void set(T a){
this.a = a;
}
public T get(){
return a;
}
public static void main(String[] args) {

Holder<SimpleRead> h = new Holder<SimpleRead>(new SimpleRead());
}
}

就像上面的例子一样,当创建一个泛型对象是,必须在<>中指定存入什么样的对象;可以说泛型就是告诉编译器想使用什么类型,然后编译器帮你处理细节,和其他的类型相比,泛型就多了一个类型参数而已。

2.元组(tuple):

他是将一组对象直接打包存储与其中的一个单一对象。这个容器对象允许读取其中的元素。但是不允许向其中存放新的对象。

一般情况下,元组是可以具有任意长度的,元组中的对象可以是不同的类型,但,我们一般希望的是能够为每一个对象指明其类型,且从容器中取出来都能够得到正确的类型,而要处理不同长度的问题,我们则需要创建多个不同的元组。

下面是一个二维元组的例子:

public class TwoTuple<A,B> {
public final A first;
public final B second;
public TwoTuple(A a,B b) {
first = a;
second = b;
}
@Override
public String toString() {
return "TwoTuple [first=" + first + ", second=" + second + "]";
}
}

通过泛型,可以很方便的创建元组,令其返回一组任意类型的对象;

3. 泛型接口:

泛型也可以应用于接口,例如生成器,这是一种专门负责创建对象的类,实际上,这是工厂方法设计模式的一种应用。不过,当使用生成器创建新的对象时,他不需要任何参数,而工厂方法一般需要参数,简而言之:生成器无需额外的信息就知道如何创建新的对象。

4. 泛型方法:

使得该方法能够独立于类而产生变化,基本原则:无论何时,只要能够做到,那么你就应该使用泛型方法,也就是说,若使用泛型方法可以去取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以让事情变得更清楚和明白。就static而言,无法访问泛型类的类型参数,所以,若static方法需要使用泛型能力,就必须使其成为泛型方法。

定义泛型方法:

public class GenericMethods {
public <T> void f(T x){
System.out.println(x.getClass().getName());
}
public static void main(String[] args) {
GenericMethods gm = new GenericMethods();
gm.f("");
gm.f(1);
gm.f(1.0);
gm.f(1.0F);
gm.f('c');
gm.f(gm);
}
}

//console

java.lang.String
java.lang.Integer
java.lang.Double
java.lang.Float
java.lang.Character
com.scujcc.base.String.GenericMethods

注意:在创建泛型类的时候一般都需要指明类型参数的值,而使用泛型方法的时候,通常不必指明参数类型,因为编译器会为我们找出具体的类型,这被称为类型参数推断。

从上面的打印也可以看出,当泛型方法接受到基本类型时,自动打包机制就会介入其中,将基本类型包装







0 0
原创粉丝点击