문제

내가 읽고 효과적 Java 예약하고 이해하지 못하나 단락이 어디 설명 Clonable 인터페이스입니다.할 수 있는 사람이 나를 설명이 절:

...프로그래머다고 가정하면 그들은 클래스를 확장하고 호출 super.clone 서브 클래스에서 반환된 객체를 인스턴스 의 서브 클래스.유일한 방법은 수퍼 클래스를 제공할 수 있습이 기능 객체를 반환에 의해 얻은 전화 super.clone.는 경우에 복제 방법 객체를 반환에 의해 만들어진 생성자,그것은 것입니다 잘못된 클래스입니다.

감사합니다.

도움이 되었습니까?

해결책

내가 참고해야로 시작하는 clone 자체가 파손,그리고 복사본을 생성자,아 Sheep(Sheep cloneMe) 은 훨씬 우아한 관용구보다 clone, 을 고려하여, Cloneable 계약은 매우 약합니다.아마 당신은 이미 알고 이것 때문에,당신은 책을 읽고,하지만 그럴 가치가 있어 넣고 여기에 있습니다.

어쨌든,질문에 대답하기:

Object.clone() 을 만들 것입의 목적은 개체와 같은 형식이었다라고 합니다.이러한 이유로,그것은 강력하게 권장하는"캐스케이드"지 Object 에 대한 결과를 얻을 계획하는 반환합니다.만약 누군가가 결정되지 않 따라 이 협약에,당신은 끝날 것이는 객체의 클래스의 형식을 파산 컨벤션,는 다양한 원인이됩니다 문제가 발생합니다.

을 설명하는 내가 있는 클래스가 다음과 같도

class Sheep implements Cloneable {

    Sheep(String name)...

    public Object clone() {
        return new Sheep(this.name); // bad, doesn't cascade up to Object
    }
}

class WoolySheep extends Sheep {

    public Object clone() {
        return super.clone();
    }
}

갑자기 할 경우

WoolySheep dolly = new WoolySheep("Dolly");
WoolySheep clone = (WoolySheep)(dolly.clone()); // error

I 을 얻을 것이기 때문에 예외가 무엇을 얻을에서 돌아 dolly.clone()Sheep, 지 WoolySheep.

다른 팁

내가 동의하지 않는@corsiKa 의 대답이다.이후 Java5.0.Java 지원하는 공변환 입력 따라서,올바로 구현한 클론()이어야 한다:

class Sheep implements Cloneable {

    Sheep(String name)...

    public Sheep clone() {
        return new Sheep(this.name);
    }
}

class WoolySheep extends Sheep {

    public WoolySheep clone() {
        return super.clone(); // compile time error, Type miss match.
    }
}

또한 제시된 대안 복사본을 생성자를 지원하지 않는 다형성이다.고려면 다음 예제(는 복사본을 생성 할 수 없):

interface Animal implements Cloneable {
  String whatAreYou()
}

class Cat implements Animal {
  String whatAreYou() {
    return "I am a cat";
  }
  Cat clone() {
    return new Cat();
  }
}

class Dog implements Animal{
  String whatAreYou() {
    return "I am a dog";
  }
  Dog clone() {
    return new Dog();
  }
}

class Lib {
  Animal cloneAnimal(Animal animal) {
    return animal.clone();
  }
}
class A {
    protected Object clone() {
        return new A();
    }
}

class B extends A implements Cloneable {
    public Object clone() {
        return super.clone();
    }
}

여기서, A 잘못된 구현 clone 이 때문에 예외가 발생:

B obj = (B)(new B()).clone();

A.clone() 전화해 super.clone() 대신 생성자입니다. Object.clone() 생 새로운 객체의 실행할 시간 입력하는 대신,컴파일 시간 형식입니다.

어떤 분야는 다음의 복제에 이 새로운 객체입니다.그것은 wpould 유혹하고 생성자를 사용하는 경우에 당신이 이미 하나는 처음 상태의 모든 분야(사본을 좋아-constructor)지만,그 결과에 잘못된 행동에 대한 모든 서브 클래스.

는 경우스 클래스 final, 다음 그것이 중요하지 않습니다 그것은 할 수 없이 어떤 서브 클래스.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top