generic 泛型
泛型在现代面向对象语言中有很重要的地位。为什么要发明泛型这个概念呢?
维基百科上认为要加强安全和减少类型转换次数
一些强类型程序语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的程序语言只能达到部分目的。
下面是各个类型泛型介绍
.NET 泛型加快运行速度
.NET 泛型的参数只可以代表类,不能代表个别对象。由于 .NET 泛型的类型参数之实际类型在运行时均不会被消除,运行速度会因为类型转换的次数减少而加快。另外,使用GetType()方法可于程序运行时得知泛型及其类型参数的实际类型,更可以运用反射编程。
Java 泛型扩充类型,但速度并未提高
泛型在2004年的J2SE5.0时被引入Java语言的,泛型作用有两个分别为扩充类型体系和保障编译时类型安全。
由于Java泛型的类型参数之实际类型在编译时会被消除,所以无法在运行时得知其类型参数的类型,而且无法直接使用基本值类型作为泛型类型参数。Java编译程序在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快。
由于运行时会消除泛型的对象实例类型信息等缺陷经常被人诟病,Java及JVM的开发方面也尝试解决这个问题,例如Java通过在生成字节码时添加类型推导辅助信息,从而可以通过反射接口获得部分泛型信息。通过改进泛型在JVM的实现,使其支持基本值类型泛型和直接获得泛型信息等。
泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法。Dart由于不存在接口概念,所以Dart支持泛型类和泛型方法。下面我介绍一下Dart语言的泛型类。
下面是demo
class User<C> {
List<C> credentials;
User(){
credentials = new List<C>();
}
addCredential(C credential){
this.credentials.add(credential);
}
}
main() {
User<int> intUser= new User<int>();
intUser.addCredential(999);
print(intUser.credentials);
}
运行效果:
[999]