1

我试图编译以下代码行并得到错误:

  public class c
  {
   vector<a> variables;
   void create_c(Vector<a> l)
   {    
     Vector<a> variables = new Vector<a>();
     variables.setSize(l.size()); // so that variables has enough capacity to store l
     /*variables= l.clone();*/
     Collections.copy(variables, l);
    }

   }

我正在尝试使用 clone() 方法或 Collections.copy() 方法将一个向量的内容复制到另一个向量。in 向量实际上是另一个具有自己的方法和变量的类。

 public class a
 {

 int a;
 void add_a(int y)
 {
 a=y;
 }

 }

虽然大多数人都建议使用 Arraylist(),但我也想使用 Vector 来实现它并检查性能。所以,如果有人能给我一个涉及向量的解决方案,我会很高兴。

代码的问题是我在 Collections.copy(variables,l) 处收到错误消息“类型不匹配:无法从对象转换为向量”。如果我注释掉 Collections.copy() 并在下一行中使用 clone() 语句尝试它,我会得到同样的错误。

我还必须提到,我的 a 类是一个公共类,在同一个包中拥有自己的文件。

我做错了什么?

4

3 回答 3

2

首先你需要注意以下几点

  • variables= l.clone()可以通过转换为您的 Vector 来解决编译错误。像这样variables = (Vector<a>)l.clone()(顺便说一句,忽略类型转换警告)
  • 给定的代码Collections.copy(variables, l);编译得很好,没有任何错误
  • 尝试Java Naming Conventions始终使用

Collections.copy()为您提供收藏的浅表副本。使用以下示例制作您的收藏的深层副本。

  • 这里被复制的类应该实现Cloneable接口并覆盖clone方法
  • 迭代原始集合并将克隆的对象添加到目标集合
  • createCopy函数返回深度复制的集合
  • 注意控制台打印语句中复制向量和原始向量的内存位置的差异

TestCopy班级_

package com.test;

import java.util.Vector;

public class TestCopy {

    private Vector<ClassToCopy> createCopy(Vector<ClassToCopy> classToCopy) {
        Vector<ClassToCopy> localVariable = new Vector<ClassToCopy>();
        for(ClassToCopy classVar:classToCopy)
            try {
                localVariable.add((ClassToCopy)classVar.clone());
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
        return localVariable;
    }

    public static void main(String[] args) {

        Vector<ClassToCopy> originalVector = new Vector<ClassToCopy>();

        TestCopy testCopy = new TestCopy();
        originalVector.add(new ClassToCopy(1));
        originalVector.add(new ClassToCopy(2));
        originalVector.add(new ClassToCopy(3));
        originalVector.add(new ClassToCopy(4));
        System.out.println(originalVector);

        Vector<ClassToCopy> copiedVector = testCopy.createCopy(originalVector);
        System.out.println(copiedVector);

    }

}

ClassToCopy班级_

package com.test;

public class ClassToCopy implements Cloneable {

    private int varA;

    /**
     * Constructor for ClassToCopy.
     * @param varA <tt></tt>
     */
    public ClassToCopy() {
        this(-1);
    }

    /**
     * Constructor for ClassToCopy.
     * @param varA <tt></tt>
     */
    public ClassToCopy(int varA) {
        super();
        this.varA = varA;
    }

    /**
     * Gets the varA.
     * 
     * @return <tt> the varA.</tt>
     */
    public int getVarA() {
        return varA;
    }

    /**
     * Sets the varA.
     *
     * @param varA <tt> the varA to set.</tt>
     */
    public void setVarA(int varA) {
        this.varA = varA;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "ClassToCopy : "+super.toString()+" [varA=" + varA + "]";
    }

    /* (non-Javadoc)
     * @see java.lang.Object#clone()
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        // TODO Auto-generated method stub
        return super.clone();
    }

}

我得到的输出

[ClassToCopy : com.test.ClassToCopy@19821f [varA=1], ClassToCopy : com.test.ClassToCopy@addbf1 [varA=2], ClassToCopy : com.test.ClassToCopy@42e816 [varA=3], ClassToCopy : com.test.ClassToCopy@9304b1 [varA=4]]
[ClassToCopy : com.test.ClassToCopy@190d11 [varA=1], ClassToCopy : com.test.ClassToCopy@a90653 [varA=2], ClassToCopy : com.test.ClassToCopy@de6ced [varA=3], ClassToCopy : com.test.ClassToCopy@c17164 [varA=4]]
于 2012-11-15T08:05:16.363 回答
1

嗨 Floose 尝试以下方法。这是工作 。

import java.util.Collections;
import java.util.Vector;

public class VectorCopyTest {

Vector<String> variables;

   void create_c(Vector l)
   {    
     Vector<String> variables = new Vector<String>();
     variables.setSize(l.size()); // so that variables has enough capacity to store l
     /*variables= l.clone();*/
     Collections.copy(variables, l);
     System.out.println(variables.size());
    }

   public static void main(String a[]){
       Vector<String> variables1 = new Vector<String>();
       variables1.addElement("hi");
       variables1.addElement("hello");
       VectorCopyTest copyTest = new VectorCopyTest();
       copyTest.create_c(variables1);
   }

}

于 2012-11-15T07:12:19.213 回答
0
Vector newVector = (Vector) oldVector.clone();

上面的代码仅适用于深度复制向量。

于 2016-01-31T10:58:20.107 回答