免备案手机网站,wordpress如何建立网站,网站建设SEO优化,企业网站开发费用展开全部大家都知道Vector以及其他的容器可以不加任何修饰地e68a8462616964757a686964616f31333236373765存储任何类型的对象,这给我们带来了极大的方便#xff0c;也使得容器很容易被复用#xff0c;但是大多数时候我们可能需要只能存储某一类型对象的Vector#xff0c;这是…展开全部大家都知道Vector以及其他的容器可以不加任何修饰地e68a8462616964757a686964616f31333236373765存储任何类型的对象,这给我们带来了极大的方便也使得容器很容易被复用但是大多数时候我们可能需要只能存储某一类型对象的Vector这是因为我们不希望由于自己失误或其他原因在Vector中添加(add())了不同类型的对象而导致在程序中其它地方的get()发生运行时异常(这是由于不正确的类型转化引发的)请看下面的例子//TestVector.javaimport java.util.Vector;class Dog{ private int number; public Dog(int number){ this.number number; } public String toString(){ return This is number #: number; }}public class TestVector { public static void main(String[] args) { Vector v new Vector(); Dog dog; v.add(new Dog(1)); v.add(new Dog(2)); v.add(new Dog(3)); v.add(new Integer(4)); //假设由于我的疏忽错误地将Integer类型的对象添加进了v中 for(int j 0; j v.size(); j){ dog (Dog)v.get(j); //想一想当取到类型为Integer的对象时将引起ClassCastException System.out.println(dog); } }}注意带有注释的那两行这种错误在编译时并不会提醒我们只能在运行时发生ClassCastException这是(Dog)v.get(j)引起的更糟糕的是当发生这种错误之后我们很难找到错误的根源在哪里换句话说就是我们到底在哪里错误地添加了那个非Dog类型的Integer对象大家运行程序就会明白。尤其是当我们在离那个错误的v.add(new Integer(4))很远的地方(可能是很多层)调用(Dog)v.get(i)时更是如此。此时大家可能会想如果限制v仅能添加Dog类型的对象问题不就解决了吗这的确是个办法解决如下//: DogVector.javaimport java.util.Vector;public class DogVector { private Vector v new Vector(); public void add(Dog dog){ v.add(dog); } public Dog get(int index){ return (Dog)v.get(index); } public int size(){ return v.size(); }}//TestDogVector.javapublic class TestDogVector { public static void main(String[] args) { Dog dog; DogVector dv new DogVector(); //明确地创建了只能存放Dog对象的DogVector dv.add(new Dog(1)); dv.add(new Dog(2)); dv.add(new Dog(3)); // dv.add(new Integer(4)); //此时如果再发生这种疏忽的话编译将不能通过 for(int i 0; i dv.size(); i){ dog dv.get(i); //此处也不需要向下转型为Dog System.out.println(dog); } }}问题得到了解决但此时大家可能郁闷了我们在这种情况下是不是要写很多这样乏味的代码每一类需要存储的对象都得写一个特定的集合类吗确实在JDK1.5以前这的确是个问题好在JDK1.5版本中sun引进了泛型--java参数化类型到此想必大家已经意识到参数类型化所要解决的问题之一,就像下面这样Vector v new Vector(); E在此处代表我们指定v中只能存放E这种类型的对象这样将确保我们不会错误地将别的类型的对象添加进去如果你非要那样做错编译器也不会允许并且我们在使用get()方法的时候也不需要向下转型为对象本身的类型E因为编译器已经为我们完成了它很清楚地知道v中存储的对象类型就是E而且get()返回的对象类型就是E而不光是Object。试试下面的例子//: TestVector2.javaimport java.util.Vector;public class TestVector2 { public static void main(String[] args) { Vector v new Vector(); Dog dog; v.add(new Dog(1)); v.add(new Dog(2)); v.add(new Dog(3)); //v.add(new Integer(4)); //此时如果再发生这种疏忽的话编译将不能通过 for (int j 0; j v.size(); j) { dog v.get(j); //此处也不需要向下转型为Dog,方法返回类型就是Dog System.out.println(dog); } }}通过使用参数类型化,还会发生更多的微妙的变化这里的v.get(j)返回为Dog型只是其中一例在上例中v的其他一些方法的参数或返回值也将发生变化有些接收Object参数的方法此时只能接受Dog或其派生类对象如v.Set(int Index, Dog element),注意如果使用Dog及其派生以外的Object类型的对象做参数时将发生编译期错误这也正是我们在这种情况下想要的效果是不是很爽呢好了罗嗦了这么多其目的就是想让大家从问题的根源来理解概念如果大家还想对其深入的话可以找一些专门的资料来看看想必学过C的朋友应该对此很容易理解,因为java的参数化类型正是借鉴了C中模板的概念。(如果你发现此贴中有不准确的地方望及时指正以免误人谢谢)本回答由提问者推荐已赞过已踩过你对这个回答的评价是评论收起