如何将对象及其子类作为对象的参数
How to have an object and its subclasses as a parameter of an object
我有一个基本问题,但我不知道如何解决。请帮助我!
如果我有 class Zoo
public class Zoo{
private Animal animal;
private Long age;
}
和Animal
段是这样的:
public class Animal{
private String name;
}
但现在我有一个新的 class 是:Dog
class, extends animal
public class Dog extends Animal {
private String dogClass;
}
我想让Zoo
中的animal
属性也接受Dog
class参数,怎么办?
有没有像List<? extends Animal>
这样优雅的写法?
如果我没记错的话,要按照你的要求去做,你所要做的就是在父子 classes 中插入构造函数并以这种方式关联它们的值:
public class Animal{
private String name;
public Animal(String name){
this.name = name;
}
}
public class Dog extends Animal{
private String dogClass;
public Dog(){
super(dogClass);
}
}
此外,如果您已经计划永远不直接实例化 Animal class,因为它是一个通用对象,您可以将其抽象化。
您无需更改任何内容:作为 Dog
扩展 Animal
,它可以分配给字段 Zoo.animal
。但是,您可以在 Zoo
中添加一个方法来获取 animal
作为特定 class:
的实例
public <T extends Animal> T getAnimal(Class<T> animalClass) {
return animalClass.cast(animal);
}
或者,如果 animal
不是指定的 class,您不希望它抛出异常:
public <T extends Animal> T getAnimal(Class<T> animalClass) {
if (!animalClass.isInstance(animal)) {
return null;
}
return animalClass.cast(animal);
}
更新:
但也许你想要的是类型化的 Zoo
:
public class Zoo<T extends Animal> {
private T animal;
private Long age;
public T getAnimal() {
return animal;
}
public setAnimal(T animal) {
this.animal = animal;
}
}
我有一个基本问题,但我不知道如何解决。请帮助我!
如果我有 class Zoo
public class Zoo{
private Animal animal;
private Long age;
}
和Animal
段是这样的:
public class Animal{
private String name;
}
但现在我有一个新的 class 是:Dog
class, extends animal
public class Dog extends Animal {
private String dogClass;
}
我想让Zoo
中的animal
属性也接受Dog
class参数,怎么办?
有没有像List<? extends Animal>
这样优雅的写法?
如果我没记错的话,要按照你的要求去做,你所要做的就是在父子 classes 中插入构造函数并以这种方式关联它们的值:
public class Animal{
private String name;
public Animal(String name){
this.name = name;
}
}
public class Dog extends Animal{
private String dogClass;
public Dog(){
super(dogClass);
}
}
此外,如果您已经计划永远不直接实例化 Animal class,因为它是一个通用对象,您可以将其抽象化。
您无需更改任何内容:作为 Dog
扩展 Animal
,它可以分配给字段 Zoo.animal
。但是,您可以在 Zoo
中添加一个方法来获取 animal
作为特定 class:
public <T extends Animal> T getAnimal(Class<T> animalClass) {
return animalClass.cast(animal);
}
或者,如果 animal
不是指定的 class,您不希望它抛出异常:
public <T extends Animal> T getAnimal(Class<T> animalClass) {
if (!animalClass.isInstance(animal)) {
return null;
}
return animalClass.cast(animal);
}
更新:
但也许你想要的是类型化的 Zoo
:
public class Zoo<T extends Animal> {
private T animal;
private Long age;
public T getAnimal() {
return animal;
}
public setAnimal(T animal) {
this.animal = animal;
}
}