摘要:为什么使用泛型泛型类和泛型方法同时具备可重用性类型安全和效率,这是非泛型类和非泛型方法无法具备的。泛型通常用与集合以及作用于集合的方法一起使用。泛型方法泛型方法,是在调用方法的时候指明泛型的具体类型。
为什么使用泛型
泛型类和泛型方法同时具备可重用性、类型安全和效率,这是非泛型类和非泛型方法无法具备的。 泛型通常用与集合以及作用于集合的方法一起使用。
可重用性:
比如要返回两个信息,一种是String类型的信息,一种是Integer类型的信息。
不使用泛型的话我们要添加两个方法,一个返回字符串,另一个返回数值类型 。
</>复制代码
public String getString(String stringMessage){
return stringMessage;
}
public Integer getInteger(Integer integerMessage){
return integerMessage;
}
而使用泛型
</>复制代码
public class Generic {
private T key;
public Generic(T key) {
this.key = key;
}
public T getKey() {
return key;
}
}
(如果用字符串和数值的强制转换,不使用泛型也可以用一个方法实现,但是有类型安全和高效率方面的问题)
类型安全:
先来看一下List的实现方式了。在List中可以放各种各样的数据类型,不论你push中的元素是什么,都变为Object类型。而且值类型向Object转换时,还得采取装箱操作,拿出来还得拆箱操作,很容易出现InvalidCastException异常。而泛型集合一旦声明了是何种数据类型的集合,就只能添加何种数据类型,不会转换成Object。
高效率
泛型集合一旦声明了是何种数据类型的集合,就只能添加何种数据类型。添加去也不会转换成Object,它是运行时动态的获取类型参数。也就是说没有装箱和拆箱这些操作。减少了处理器的资源浪费。
泛型只在编译阶段有效。看下面的代码:
</>复制代码
List stringArrayList = new ArrayList();
List integerArrayList = new ArrayList();
Class classStringArrayList = stringArrayList.getClass();
Class classIntegerArrayList = integerArrayList.getClass();
if(classStringArrayList.equals(classIntegerArrayList)){
Log.d("泛型测试","类型相同");
}
输出结果:D/泛型测试: 类型相同。
通过上面的例子可以证明,在编译之后程序会采取去泛型化的措施。也就是说Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦出,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行时阶段。
泛型方法泛型方法,是在调用方法的时候指明泛型的具体类型 。
下面的例子演示了如何使用泛型方法打印不同字符串的元素:
</>复制代码
public class GenericMethodTest
{
// 泛型方法 printArray
public static < E > void printArray( E[] inputArray )
{
// 输出数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] )
{
// 创建不同类型数组: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { "H", "E", "L", "L", "O" };
System.out.print( "整型数组元素为:" );
printArray( intArray ); // 传递一个整型数组
System.out.print( "
双精度型数组元素为:" );
printArray( doubleArray ); // 传递一个双精度型数组
System.out.print( "
字符型数组元素为:" );
printArray( charArray ); // 传递一个字符型数组
}
}
编译以上代码,运行结果如下所示:
整型数组元素为:1 2 3 4 5
双精度型数组元素为:1.1 2.2 3.3 4.4
字符型数组元素为:H E L L O
类型通配符类型通配符一般是使用?代替具体的类型参数。例如 List 在逻辑上是List
</>复制代码
public class GenericTest {
public static void main(String[] args) {
List name = new ArrayList();
List age = new ArrayList();
List number = new ArrayList();
name.add("icon");
age.add(18);
number.add(314);
getData(name);
getData(age);
getData(number);
}
public static void getData(List data) {
System.out.println("data :" + data.get(0));
}
}
输出结果为:
data :icon
data :18
data :314
在java中是”不能创建一个确切的泛型类型的数组”的。
下面的这个例子是不可以的,编译阶段会直接提示错误:
</>复制代码
List[] ls = new ArrayList[10];
而使用通配符创建泛型数组是可以的,如下面这个例子:
</>复制代码
List[] ls = new ArrayList[10];
这样也是可以的:
</>复制代码
List[] ls = new ArrayList[10];
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/76424.html
摘要:首先,我们来按照泛型的标准重新设计一下类。注意参数为而不是泛型。利用形式的通配符,可以实现泛型的向上转型,来看例子。需要注意的是,无法从这样类型的中取出数据。showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac3bf3eb16160c); 00、故事的起源 二哥,要不我上大学的时候也学习编程吧?有一天,三妹突发奇想地问我。 你确定要做一名...
摘要:接口也是集合中的一员,但它与接口有所不同,接口与接口主要用于存储元素,而主要用于迭代访问即遍历中的元素,因此对象也被称为迭代器。迭代器的实现原理我们在之前案例已经完成了遍历集合的整个过程。 【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 [ ] 能够说出集合与数组的区别 [ ] 说出Collection集合的常用功能 [ ]...
摘要:静态变量是被泛型类的所有实例所共享的。所以引用能完成泛型类型的检查。对于这个类型系统,有如下的一些规则相同类型参数的泛型类的关系取决于泛型类自身的继承体系结构。事实上,泛型类扩展都不合法。 前言 和C++以模板来实现静多态不同,Java基于运行时支持选择了泛型,两者的实现原理大相庭径。C++可以支持基本类型作为模板参数,Java却只能接受类作为泛型参数;Java可以在泛型类的方法中取得...
摘要:以上代码编译通过,运行通过引入泛型的同时,也为了兼容之前的类库,开始引入的其实是伪泛型,在生成的字节码中是不包含泛型中的类型信息的。进行类型擦除后,类型参数原始类型就是擦除去了泛型信息,最后在字节码中的类型变量的真正类型。 Java泛型 Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在...
阅读 2555·2023-04-25 19:27
阅读 3601·2021-11-24 09:39
阅读 4006·2021-10-08 10:17
阅读 3479·2019-08-30 13:48
阅读 2106·2019-08-29 12:26
阅读 3207·2019-08-28 17:52
阅读 3621·2019-08-26 14:01
阅读 3620·2019-08-26 12:19