Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可克隆的界面有一些不正确的地方_Java - Fatal编程技术网

Java 可克隆的界面有一些不正确的地方

Java 可克隆的界面有一些不正确的地方,java,Java,克隆方法给我一个错误: 无法直接调用类型项的抽象方法克隆 Item类是实现可克隆接口的抽象类。Item是抽象类吗?如果是这样,您就不能重写该方法,然后尝试在其中调用超类的实现,因为该实现不存在。它不会给我任何错误。你试过这个吗?无论如何,您必须将返回类型强制转换为Item,因为它返回的是Object的类型。您可以详细说明如何更正itI吗?如果没有发现任何问题,您可能需要指定哪一行给出了错误。查看运行良好的my代码段。人们普遍认为Java中的Cloneable接口已损坏。这运行良好,但如果我这样做

克隆方法给我一个错误:

无法直接调用类型项的抽象方法克隆


Item类是实现可克隆接口的抽象类。

Item是抽象类吗?如果是这样,您就不能重写该方法,然后尝试在其中调用超类的实现,因为该实现不存在。它不会给我任何错误。你试过这个吗?无论如何,您必须将返回类型强制转换为Item,因为它返回的是Object的类型。您可以详细说明如何更正itI吗?如果没有发现任何问题,您可能需要指定哪一行给出了错误。查看运行良好的my代码段。人们普遍认为Java中的Cloneable接口已损坏。这运行良好,但如果我这样做,则无法使用Item class对象调用clone方法。当我们想将克隆过程的一部分或全部移交给super class时,您能帮我做一些选择吗?我们称之为super.clone。但在您的例子中,您已经声明了clone方法abstract,并在子类中调用了abstract/non-implemented方法。所以,解决方案是要么从超类中删除抽象克隆方法,这样API就可以调用“java.lang.Object.clone”方法,要么实现克隆方法。可能我的理解是,若你们在超类项中有自定义克隆逻辑,那个么实现克隆方法。我再次更新了代码。
public class Tool extends Item {
    @Override
    public Item clone() throws CloneNotSupportedException
    {
        return super.clone();
    }
}
public class CloneTest {

    static abstract class Item implements Cloneable {
        private boolean stackable;

        protected String name;

        public Item() {
            this.name = new String("Air");
            this.stackable = true;
        }

        public Item(String name) {
            this.name = name;
            this.stackable = true;
        }

        public Item(String name, boolean stackable) {
            this.name = name;
            this.stackable = stackable;
        }

        public String getName() {
            return this.name;
        }

        public void setName(String n) {
            this.name = n;
        }

        @Override
        public boolean equals(Object rhs) {
            Item r = (Item) rhs;

            return (this.name).equals(r.name);
        }

        @Override
        public int hashCode() {
            return this.name.hashCode();
        }

        public boolean isStackable() {
            return this.stackable;
        }

        public abstract void read(Scanner s);

        @Override
        public Item clone() throws CloneNotSupportedException {
           Object obj = super.clone();
           // Add some custom logic here... like initializing few members
           return (Item) obj;
        }

        @Override
        public String toString() {
            return (" " + this.name);
        }
    }

    public static class Tool extends Item {

        @Override
        public Item clone() throws CloneNotSupportedException {
            return super.clone();
        }

        @Override
        public void read(Scanner s) {

        }
    }

    public static void main(String[] args) throws CloneNotSupportedException 
{
        Tool tool1 = new Tool();
        System.out.println(tool1);
        Object tool2 = tool1.clone();
        System.out.println(tool2);
        System.out.println(tool1 == tool2);
    }
}