前提・実現したいこと
画面表示
コピー後
p1Person [name=name1, age=21, item=Item [name=アイテム1]]
p2Person [name=name1, age=21, item=Item [name=アイテム1]]
アイテム変更後
p1Person [name=name1, age=23, item=Item [name=アイテム2]]
p2Person [name=name1, age=21, item=Item [name=アイテム1]]
を目指し、
cloneメソッドをなるべく少ない行で完成させようと考えています。
Personクラス内にclone()メソッドを記述して、p1とp2を作ります。
発生している問題・エラーメッセージ
問題:
Personフィールドの
private String name;
private int age;
に対しては
「result = (Person)super.clone();」で対応できるのですが、
参照型のItem itemに対して上手く深いコピーができません。
「result.item = (Item)this.item.clone();」
Exception in thread "main" java.lang.Error: Unresolved compilation problem: メソッド clone() は型 Object で不可視です at Person.clone(Person.java:27) at Main.main(Main.java:10)
該当のソースコード
public class Main {
public static void main(String[] args) { Item item = new Item("アイテム1"); Person p1 = new Person("name1", 21, item); Person p2 = p1.clone(); System.out.println("コピー後"); System.out.println("p1" + p1); System.out.println("p2" + p2); item.setName("アイテム2"); p1.setAge(23); System.out.println("アイテム変更直後"); System.out.println("p1" + p1); System.out.println("p2" + p2); }
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
public class Person implements Cloneable {
private String name;
private int age;
private Item item;
public Person() {} public Person(String name, int age, Item item){ this.name = name; this.age = age; this.item = item; } public Person clone() { Person result = null; try { //この一行で全てのフィールドをコピーする result = (Person)super.clone(); //フィールドに参照型を含む場合 //[メソッド clone() は型 Object で不可視です]となってしまう。 result.item = (Item)this.item.clone(); }catch(CloneNotSupportedException e) { e.printStackTrace(); } return result; } //setter,getterは省略 public String toString() { return "Person [name =" + name + ", age=" + age + ", item=" + item + "]"; }
}
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
public class Item {
private String name;
public Item() {} public Item(String name) { this.name = name; }
public String toString() {
return "Item [name =" + name + "]";
}
//setter,getterは省略
}
言語:java
試したこと
妥協案として
Item itemCopy = new Item();
itemCopy = (Item)this.item;
result.item =itemCopy;
で、Itemをインスタンス化しましたが
Itemクラス内のString nameをprivateにすると
うまく行きませんでした。
補足情報(FW/ツールのバージョンなど)
ツール:eclpipse Version: 2020-03 (4.15.0)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/10 01:30
2020/05/10 01:46
2020/05/10 02:30