2016-06-16 7 views
0

私はcardsのタイプがVector[Card]である次のメソッドを持っています。 cardsはフィールドなので、そのクローンを返したいと思います。ベクターのクローニング方法

私はこれを試してみました:

class Deck(cards: Vector[Card] = Vector.empty[Card]) { 

    //other methods 

    def getCards(): Vector[Card] = { 
     return cards.clone() 
     } 
} 

しかし、私は取得しています:

Error:(31, 18) method clone in class Object cannot be accessed in Vector[<error>] 
Access to protected method clone not permitted because 
prefix type Vector[<error>] does not conform to 
class Deck in package genericGame where the access take place 
    return cards.clone() 
       ^

は、どのように私は、フィールドのクローンを作成することができますか?

+3

ベクトルは不変です。単に 'cards'を返してください。何も変更できません(クローン可能な形質を見ると、それは可変コレクションにしか使われません) –

答えて

3

cardsを返す必要はありません。オブジェクトのコピーをとり、ソースが後で変更される可能性があるため、ソースから独立して作業する必要のある変更可能オブジェクトのクローン作成が通常必要です。

Vectorは不変であるため、その参照は安全に保持することができ、カード自体が変更可能でない限り、常にCardの同じ値を保持します。次に、コピーするメソッドを追加できますカードを持って、mapをしてください。私が言ったようにCardが不変であれば

class Card(var name:String){ 
    def copy() = new Card(this.name) 
} 
val copy: Vector[Card] = vector.map(_.copy()) 

しかし、このすべては、(例えばcaseクラス)を使用すると、任意のsafleyコピーせずに、あなたのVectorを使用することができます必要とされません。

関連する問題