gpt4 book ai didi

java - 当子类扩展父类(super class)时自动将其添加到列表中

转载 作者:行者123 更新时间:2023-12-01 16:13:10 26 4
gpt4 key购买 nike

这是我想做的:

假设我创建了一个名为 Animal 的类。然后我创建一个名为 Dog 的类来扩展 Animal。仅通过这样做,是否可以将 Dog 添加到名为 AnimalManager 的第三类中的列表中?如果我必须调用 Animal 类中的方法,那很好,但我希望创建一个 Dog 的实例,而不需要对 Dog 的实例进行硬编码。这似乎不太可能。注意:我只想要每个类的一个实例。

感谢您提前提供的任何帮助。

更新:

这是对我的问题的更好描述。它也有一个解决方案。在你的帮助下我找到了这个。谢谢您的帮助! At runtime, find all classes in a Java application that extend a base class

最佳答案

您可以使用Reflections .

Reflections reflections = new Reflections("cz.milanhlinak.animal");
Set<Class<? extends Animal>> animals = reflections.getSubTypesOf(Animal.class);

查看我的示例存储库 https://github.com/milanhlinak/62481200我在哪里使用 Reflections + Google Guice用于依赖注入(inject)。

使用 Reflections,您可以获得 Animal 类的所有子类型,并将它们添加到 Google Guice Multibinder。之后,您可以将它们注入(inject)某处...

// cz.milanhlinak.Module.java
public class Module extends AbstractModule {

@Override
protected void configure() {

Reflections reflections = new Reflections("cz.milanhlinak.animal");
Set<Class<? extends Animal>> animals = reflections.getSubTypesOf(Animal.class);

Multibinder<Animal> animalBinder = Multibinder.newSetBinder(binder(), Animal.class);
animals.forEach(animal -> animalBinder.addBinding().to(animal));

bind(AnimalProvider.class).to(AnimalProviderImpl.class).in(Singleton.class);
}
}

// cz.milanhlinak.animal.Animal.java
public abstract class Animal {

private final String sound;

public Animal(String sound) {
this.sound = sound;
}

void makeSound() {
System.out.println(this.sound);
}
}

// cz.milanhlinak.animal.Dog.java
public class Dog extends Animal {

public Dog() {
super("Bark");
}
}

// cz.milanhlinak.animal.Cat.java
public class Cat extends Animal {

public Cat() {
super("Meow");
}
}

// cz.milanhlinak.animal.AnimalProvider.java
public interface AnimalProvider {

Set<Animal> getAnimals();
}

// cz.milanhlinak.animal.AnimalProviderImpl.java
public class AnimalProviderImpl implements AnimalProvider {

private final Set<Animal> animals;

@Inject
public AnimalProviderImpl(Set<Animal> animals) {
this.animals = animals;
}

@Override
public Set<Animal> getAnimals() {
return this.animals;
}
}

您还可以查看Google Guice - how to automatically add binding我在其中寻找类似的东西,但基于自定义注释。

关于java - 当子类扩展父类(super class)时自动将其添加到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62481200/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com