众所周知,Object类型为所有类的父亲,它的引用可以接受任何类型的对象。传统的List类的add方法也是以Object类型为参数,自然对应的get方法返回的也是Object类型。多数情况下,我们只是将一种类型添加到集合类(如List)中,取出数据时都只能为Object,必须经过转换才能变回自己,此时泛型的出现便很好地解决了这个问题。
泛型在创建对象时使用<类型>声明类型,如:
List<String>list=new LinkedList<String>();此时List便只能接受String类型的对象。
取一例子说明泛型的用法:
public class Testing {
public List<String>getList(){
List<String>list=new LinkedList<String>();//创建泛型List类对象
list.add("one");//将"one"添加到list
list.add("two");//将"two"添加到list
list.add("three");//将"three"添加到list
return list;
}
public static void main(String[] args)
{
Testing test=new Testing();//创建对象
List<String>list=test.getList();//创建List类对象,接受test中的字符串
String s=list.get(0);//将list中的字符串赋值给s
System.out.println(s);//输出s
}
}
使用泛型的好处不外乎两点:
其一:当添加一个元素时,编译器可以根据参数化类型判断该类型是否合法;若非法,则报错。
其二:当取出元素时,可以直接获得参数化指定类型,并非原始Object类。
*泛型的检测只是在编译期间,所以关于参数化类型的信息都是在编译期处理的;在运行期间,它们就会被擦除!
需要提醒的是,即使两个类的参数类型存在继承关系,也不能进行如下操作;
List<Number>list=new LinkedList<Number>();
List<Byte>list2=new LinkedList<Byte>();//不能这样操作
list=list2 //泛型的参数不能当作父类与子类那样使用。
除了系统本身有的泛型,我们可以自定义泛型使用,例子如下:
public class Testing<E> {
private List<E>list;
private final int size;
public Testing(int size)
{
list=new ArrayList<E>();
this.size=size;
}
public void add(E e)
{
if(list.size()<size)
{
list.add(e);
System.out.println("元素"+e+"添加成功!");
}
else{
System.out.println("空间已满,无法再添加!");
}
}
public void remove(int index)
{
if(index>=list.size())
{
System.out.println("index过大!");
}
else{
E e=list.remove(index);
System.out.println("元素"+e+"已成功删除!");
}
}
public static void main(String[] args)
{
Testing<Integer>ab1=new Testing<Integer>(3);
ab1.add(1);
ab1.add(2);
ab1.add(3);
ab1.add(4);
ab1.remove(4);
ab1.remove(0);
//////////////////////////////////////////////////////////////////////////
Testing<String>ab2=new Testing<String>(4);
ab2.add("gold");
ab2.add("wood");
ab2.add("water");
ab2.add("fire");
ab2.add("earth");
ab2.remove(3);
}
}
分享到:
相关推荐
泛型类、泛型方法、泛型接口、泛型委托 泛型类、泛型方法、泛型接口、泛型委托
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。 比如: Pool<Point> pool = new Pool(){}; Point p = pool.get(x, y); //在此构造Point对象 ... pool.put(p); 希望能帮助那些为查找泛型构造器、...
在.NET FCL为我们提供了很多...结论:如果在C#2.0版本以上,尽量使用泛型集合类,而不使用非泛型集合类。因为,1. 泛型编程是从c#2.0开始才被.net支持的。2.泛型集合在性能和类型安全方面优于非泛型集 合。 。。。。
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
泛型集合解释的非常好泛型集合泛型集合泛型集合解释的非常好泛型集合泛型集合泛型集合解释的非常好泛型集合泛型集合泛型集合解释的非常好泛型集合泛型集合
泛型的知识,请自己参考吧。主要介绍java泛型的知识。
Java 运行时如何获取泛型参数的类型 Java类型Type 之 ParameterizedType,GenericArrayType,TypeVariabl,WildcardType 从实现的接口获取泛型参数 定义一个泛型父类: public interface SuperClass { String ...
C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型C#,泛型
Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南
泛型编程在C++领域中早已深入人心,它赋予了类型参数式多态的能力,这种能力在ISO-C++中以编译时的模板实例化为依托。而CLI借自己强大的元数据系统,选择了运行时的模板实例化来支持泛型编程。C++/CLI在保留ISO-C++...
C#的泛型C#的泛型
集合框架及泛型的介绍和基础理解,方便大家了解集合框架及泛型。
泛型学习和泛型接口和泛型经典示例
Java 实现泛型List的源码,基本实现了List接口的全部所有方法。欢迎大家发表自己的观点和建议。
同时,因为反射会带来性能损失,因此,可根据自己需求,针对每个类型轻松在两种模式之前切换,本例源码,测试实例俱全,而且代码浅显易懂,只要对泛型、反射、三层架构有一定了解的人都能轻松学习
java 一个关于泛型的简单例子 java 一个关于泛型的简单例子 java 一个关于泛型的简单例子
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...