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