JAVA中的泛型类是什么东西?

Python07

JAVA中的泛型类是什么东西?,第1张

泛型(Generictype或者generics)是对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。\x0d\x0a可以在集合框架(Collectionframework)中看到泛型的动机。例如,Map类允许您向一个Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如String)的对象。\x0d\x0a因为Map.get()被定义为返回Object,所以一般必须将Map.get()的结果强制类型转换为期望的类型,如下面的代码所示:\x0d\x0a\x0d\x0aMapm=newHashMap()\x0d\x0a\x0d\x0am.put("key","blarg")\x0d\x0a\x0d\x0aStrings=(String)m.get("key")\x0d\x0a\x0d\x0a要让程序通过编译,必须将get()的结果强制类型转换为String,并且希望结果真的是一个String。但是有可能某人已经在该映射中保存了不是String的东西,这样的话,上面的代码将会抛出ClassCastException。\x0d\x0a理想情况下,您可能会得出这样一个观点,即m是一个Map,它将String键映射到String值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。\x0d\x0a泛型的好处\x0d\x0aJava语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。这带来了很多好处:\x0d\x0a·类型安全。泛型的主要目标是提高Java程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。\x0d\x0aJava程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String列表”或者“String到String的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作ClassCastException展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。\x0d\x0a·消除强制类型转换。泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。\x0d\x0a尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。\x0d\x0a该代码不使用泛型:\x0d\x0a\x0d\x0aListli=newArrayList()\x0d\x0a\x0d\x0ali.put(newInteger(3))\x0d\x0a\x0d\x0aIntegeri=(Integer)li.get(0)\x0d\x0a\x0d\x0a该代码使用泛型:\x0d\x0a\x0d\x0aListli=newArrayList()\x0d\x0a\x0d\x0ali.put(newInteger(3))\x0d\x0a\x0d\x0aIntegeri=li.get(0)\x0d\x0a\x0d\x0a在简单的程序中使用一次泛型变量不会降低罗嗦程度。但是对于多次使用泛型变量的大型程序来说,则可以累积起来降低罗嗦程度。\x0d\x0a·潜在的性能收益。泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的JVM的优化带来可能。\x0d\x0a由于泛型的实现方式,支持泛型(几乎)不需要JVM或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。\x0d\x0a泛型用法的例子

如:List<String>list = new ArrayList<String>()list.add("1")list.add("2")采用泛型写法后,list想加入一个Integer类型的对象时会出现编译错误,通过List<String>,直接限定了list集合中只能含有String类型的元素,从而在后续如果进行for循环就无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。

public class Test {

public static void main(String[] args){

List<A>list = new ArrayList<A>()

A a1 = new A("101","01","122222222","上海")

A a2 = new A("102","02","133333333","南京")

A a3 = new A("103","03","142333223","上海")

A a4 = new A("104","04","125555552","上海")

list.add(a1)

list.add(a2)

list.add(a3)

list.add(a4)

}

}

class A{

private String ID

private String num

private String iphone

private String address

public String getID() {

return ID

}

public void setID(String iD) {

ID = iD

}

public String getNum() {

return num

}

public void setNum(String num) {

this.num = num

}

public String getIphone() {

return iphone

}

public void setIphone(String iphone) {

this.iphone = iphone

}

public String getAddress() {

return address

}

public void setAddress(String address) {

this.address = address

}

public A(String id,String num,String iphone,String address){

this.ID = id

this.num = num

this.iphone = iphone

this.address=address

}

}

我写了个例子,应该能明白了吧?也就是吧你集合的数据封装成一个对象,这样泛型的时候就可以泛型成这个对象了。A也就是你说的T 这样就是你要的把数据封装成了A类对象

希望能帮到你!