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 vectorは、実際には独自のメソッドと変数を持つ別のクラスです。

 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ディープ コピーされたコレクションを返します
  • コンソールの print ステートメントで、コピーされたベクトルと元のベクトルのメモリ位置の違いに注目してください。

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 に答える