Ⅰ java中泛型是什么意思,作用是什么
java 泛型是java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
可以在集合框架(Collection framework)中看到泛型的动机。例如,Map 类允许您向一个 Map 添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象。
因为 Map.get() 被定义为返回 Object,所以一般必须将 Map.get() 的结果强制类型转换为期望的类型,如下面的代码所示:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
要让程序通过编译,必须将 get() 的结果强制类型转换为 String,并且希望结果真的是一个 String。但是有可能某人已经在该映射中保存了不是 String 的东西,这样的话,上面的代码将会抛出 ClassCastException。
理想情况下,您可能会得出这样一个观点,即 m 是一个 Map,它将 String 键映射到 String 值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。
泛型的好处
Java 语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。
这带来了很多好处:
1,类型安全。 泛型的主要目标是提高 Java 程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
3,潜在的性能收益。 泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM 的优化带来可能。由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。
Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
泛型在使用中还有一些规则和限制:
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(Java.lang.String);
泛 型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。在此给出我曾经了解泛型时候写出的两个例子(根据看的印象写的),实现同样的 功能,一个使用了泛型,一个没有使用,通过对比,可以很快学会泛型的应用,学会这个基本上学会了泛型70%的内容。
Ⅱ 北大青鸟java培训:JAVA泛型浅谈
1.概述在引入泛型之前,Java类型分为原始类型、复杂类型,其中复杂类型分为数组和类。
java课程http://www.kmbdqn.cn/发现引入范型后,一个复杂类型就可以在细分成更多的类型。
例如原先的类型List,现在在细分成List<Object>,List<String>等更多的类型。
注意,现在List<Object>,List<String>是两种不同的类型,他们之间没有继承关系,即使String继承了Object。
2.定义&使用类型参数的命名风格为:推荐你用简练的名字作为形式类型参数的名字(如果可能,单个字符)。
最好避免小写字母,这使它和其他的普通的形式参数很容易被区分开来。
使用T代表类型,无论何时都没有比这更具体的类型来区分它。
这经常见于泛型方法。
如果有多个类型参数,我们可能使用字母表中T的临近的字母,比如S。
如果一个泛型函数在一个泛型类里面出现,最好避免在方法的类型参数和类的类型参数中使用同样的名字来避免混淆。
对内部类也是同样。
2.1定义带类型参数的类在定义带类型参数的类时,在紧跟类命之后的<>内,指定一个或多个类型参数的名字,同时也可以对类型参数的取值范围进行限定,多个类型参数之间用,号分隔。
定义完类型参数后,可以在定义位置之后的类的几乎任意地方(静态块,静态属性,静态方法除外)使用类型参数,就像使用普通的类型一样。
注意,父类定义的类型参数不能被子类继承。
2.2定义待类型参数方法在定义带类型参数的方法时,在紧跟可见范围修饰(例如public)之后的<>内,指定一个或多个类型参数的名字,同时也可以对类型参数的取值范围进行限定,多个类型参数之间用,号分隔。
定义完类型参数后,可以在定义位置之后的方法的任意地方使用类型参数,就像使用普通的类型一样。
Ⅲ java泛型有什么用
泛型。规定了此集合中元素的类型。例如:ArrayListarr=newArrayList();这样就创建了一个包含整数的ArrayList对象。如果要自己定义泛型类,就用如下形式:classMyCollection{}尖括号中的类型可以有限制,例如你需要让MyCollection中的类型都具有可比性,可以用如下格式:classMyCollection{}此外,要注意泛型的一些特性:1.不能直接创建泛型数组。如newArrayList[5]之类的是错的。只能用如下方法:newArrayList[5]或者(ArrayList[])newArrayList[5];2.静态方法中需要小心,因为E一般是非静态类型,如果你这样写:classMyCollection{publicstaticMyCollectionabc(){}}是错的。你只能把去掉。
Ⅳ Java基础知识总结:什么时候用泛型类
当类中的操作的引用数据类型不确定的时候,以前用的Object来进行扩展的,现在可以用泛型来表示。这样可以避免强转的麻烦,而且将运行问题转移到的编译时期。
----------------------------------------------------------
泛型在程序定义上的体现:
//泛型类:将泛型定义在类上。
class Tool {
private Q obj;
public void setObject(Q obj) {
this.obj = obj;
}
public Q getObject() {
return obj;
}
}
//当方法操作的引用数据类型不确定的时候,可以将泛型定义在方法上。
publicvoid method(W w) {
System.out.println("method:"+w);
}
//静态方法上的泛型:静态方法无法访问类上定义的泛型。如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。
public static void function(Q t) {
System.out.println("function:"+t);
}
//泛型接口.
interface Inter{
void show(T t);
}
class InterImplimplements Inter{
public void show(R r) {
System.out.println("show:"+r);
}
}
Ⅳ JAVA中的泛型用法一种: <T> 返回值用法。
1、对于泛型方法来说,是可以接收不同类型的参数,比如下图,使用泛型来操作List集合,然后向List中添加一条数据,看是否可以添加成功,创建泛型方法如图所示。
Ⅵ 除了集合,java中的泛型还用于哪些场景
publicclassMain{
publicstaticvoidmain(String[]args){
Stringstr=Simple.getSome("string");
System.out.println(str.getClass().getName()+""+str);
Integernumber=Simple.getSome(Integer.valueOf(5));
System.out.println(number.getClass().getName()+""+number);
Studentstudent=Simple.getSome(newStudent("张三"));
System.out.println(student.getClass().getName()+""+student);
}
}
classSimple{
publicstatic<T>TgetSome(Tt){
returnt;
}
}
classStudent{
privateStringname;
publicStudent(Stringname){
super();
this.name=name;
}
@Override
publicStringtoString(){
return"Student[name="+name+"]";
}
}
使用泛型 Simple类的getSome方法可以根据任意输入返回不同的类型
publicclassMain{
publicstaticvoidmain(String[]args){
Simple<String>s=newSimple<String>();
}
}
classSimple<T>{
privateList<T>list=null;
publicSimple(){
super();
this.list=newArrayList<T>();
}
}
Simple类有个 List 但是 List中的类型 直到new Simple 时候才确定
Ⅶ Java 泛型如何使用
拿LIST做例子吧,泛型就是保证了LIST存储的内容的类型。
比如List<String> slist,那就可以直接往slist里存String类型的东西,取出来时也不用做类型转换,直接slist.get(i)就是取出内容了。如果非泛型的LIST,取出来是object类型,要做类型转换
Ⅷ java中的泛型具体能应用在哪些方面上
泛型本质上是提供类型的"类型参数",它们也被称为参数化类型(parameterized type)或参量多态(parametric polymorphism)。其实泛型思想并不是 Java 最先引入的,C++ 中的模板就是一个运用泛型的例子。
具体应用会在实际开发中领悟到的!
Ⅸ java中什么是泛型,怎么用泛型
这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中:
1:什么是泛型?
泛型就是广泛的类型,也是一种数据类型,而这种数据类型可以是任意类型,编写过程中当中不能确定类型,创建对象时必须指定具体类型,不指定也可以,但是会出现一些错误。
泛型是编译器行为,只能在编译期有效,如果能够跨过编译器,那么泛型就没有任何意义了。
2、泛型类
怎么定义泛型类?
在类后面加<>,<>中可以编写任意长度任意字符,不能是数值。(一般用26个大写英文字母表示)
泛型类 <具体类型> 变量名 = new 泛型类<>();
3.怎么使用泛型
有以下几种使用场景以及放在那种位置
泛型只能定义引用数据类型,而不能使用基本数据类型
泛型类、泛型方法、泛型接口、泛型通配符
例如:作用在类上时( public class Animal <E> { E pet; } ) , 泛型跟在类后边,可以指定用了泛型的类内部的 pet 的类型。
作用在对象上时( Animal<Dog> str = new Animal<Dog>(); ) , 泛型跟在类后边 , 使得对象类的的 pet 属性为 Dog类型。
Ⅹ java 泛型的几种用法
1. public class DAO<T> {
/**
* 泛型类
* 声明类的同时声明泛型类型
* 1.方法的返回值可以是使用声明的泛型类型
* 2.方法的参数也可以是声明类的泛型类型
* 3.方法体内可以使用泛型类型
*/
public T get(Integer id){
return null;
}
public void save(T entity){
}
}
2.
/**
* 泛型方法: 在方法声明时, 同时声明泛型. 在方法的返回值, 参数列表以及方法体中都可以使用泛型类型.
* public static <T> T get(Integer id){
* T result = null;
* return result;
* }
* 把指定类型的数组中的元素放入到指定类型的集合中
*/