Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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_Polymorphism - Fatal编程技术网

Java:对超类型调用方法不使用子类型';实施

Java:对超类型调用方法不使用子类型';实施,java,polymorphism,Java,Polymorphism,我对下面的代码示例有问题: public abstract class PetBuilder<T extends PetBuilder<T>> { String name; int age; public T name(String name) { this.name = name; } public T age(String age) { this.age = age; } public T copy(Pet pet) { this.n

我对下面的代码示例有问题:

public abstract class PetBuilder<T extends PetBuilder<T>> {

  String name;
  int age;

  public T name(String name) { this.name = name; }
  public T age(String age) { this.age = age; }

  public T copy(Pet pet) {
    this.name = pet.name;
    this.age = pet.age;
  }

  public abstract Pet build();

}

public class CatBuilder extends PetBuilder<CatBuilder> {

  String color;

  public CatBuilder color(String color) { this.color = color; }  

  @Override
  public CatBuilder copy(Cat cat) {
    super.copy(cat);
    this.color = cat.color;
    return this;
  }

  @Override
  public Cat build() {
    return new Cat(this);
  }

}

public abstract class Pet {

  protected String name;
  protected int age;

  Pet(PetBuilder builder) {
    this.name = builder.name;
    this.age = builder.age;
  }

  public abstract PetBuilder builder();

  public Pet withAge(int age) {
    return this.builder().copy(this).age(age).build();
  }

}

public class Cat extends Pet {

  private String color;

  Cat(CatBuilder builder) {
    super(builder);
    this.color = color;
  }

  @Override
  public CatBuilder builder() { return new CatBuilder(); }

  @Override
  public Cat withAge(int age) {
    return (Cat) super.withAge(age);
  }

}
最后我得到了一个
Cat
(felix)的实例,它的颜色是
null
,而不是“黑色”

使用调试器检查时,似乎从未调用类
CatBuilder
的方法
copy()
,即使
this.builder()
返回的底层对象是
CatBuilder
实例


有没有一种方法可以使这项工作正常,这样我就不必在
Pet
的子类中用something()方法复制所有的

copy()
处的
@Override
应该已经创建了一个编译错误。无论如何,您需要执行
@Override public CatBuilder copy(Pet cat){
您不能在重写时更改参数类型。感谢@k5_uu的评论,我想我在我的真实代码中缺少了
@Override
!在
copy()中的
@Override
应该创建了一个编译错误。无论如何,您需要执行
@Override public CatBuilder copy(Pet cat){
在重写时您不能更改参数类型。感谢@k5_u的评论,我想我的真实代码中缺少了
@Override
Cat felix = new CatBuilder().age(5).name("Felix").color("black").build();
felix = felix.withAge(6);