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);
}
}