java I可以通过传递不同的参数来控制方法返回值的类型吗?

v09wglhw  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(111)

给予一个具体的例子,我希望做一些类似下面的事情(当然是人为的例子):

Interface Animal {}
Interface AnimalImpl {}
Interface Lion extends Animal {}
Interface Hippo extends Animal {}
Class LionImpl implements Lion, AnimalImpl {}
Class HippoImpl implements Hippo, AnimalImpl {}

然后我们有一个动物园,每种类型最多只能有一种动物。它包含了一些类似于从类到AnimalImpl的Map的东西。
那么我会称之为
zoo.getAnimal(Lion.class)并让它返回一个Lion。我可以让它返回一个AnimalImpl,但之后我必须强制转换为Lion -我希望避免这种强制转换。(同样,如果我调用zoo.getAnimal(Hippo.class),它应该返回一个Hippo。)

bwitn5fc

bwitn5fc1#

不是这样写的。静态返回类型是“AnimalImp”。但是泛型可能能够解决您的问题;比如

class zoo {
    <T> T getAnimal(Class<T> clazz);
}
hjqgdpho

hjqgdpho2#

泛型,但是,你不想使用java.lang.Class的示例作为这样的选择载体。这是非常不灵活的。例如,作业“嘿,这是Class<Lion>的示例,现在你可以做一个狮子”不起作用-你必须破解类型系统,然后..在运行时使用反射来请求无参数构造函数,调用它,并祈祷它能工作。没有办法告诉编译器Lion(类)* 必须 * 有一个无参数的公共构造函数,而且它也不能是抽象的。
更好的解决方案是......制造一个工厂!(是的,java是一种陈词滥调的“到处都是工厂”的语言,但那只是误解了这是什么的人,或者是从代码库中剽窃注解的人。这个概念非常有用,不要让迷因误导你)。
您需要这样一个概念:“一个可以使用这种基于类型系统的规范来描述动物并为该动物创建新示例的东西”。
因此,您需要类似以下的内容:

public interface AnimalMaker<A extends Animal> {
  A create();
  String describe();
}

public abstract class Animal {}

public class Lion extends Animal {}

public class LionMaker implements AnimalMaker<Lion> {
  public Lion create() { return new Lion(); }
  public String describe() { return "Describe lion here"; }
}

然后你可以用一个方法把狮子变成这样

public class Zoo {
  public <A extends Animal> A importAnimal(AnimalMaker<A> maker) {
    A animal = maker.create();
    animals.add(animal);
    return animal;
  }
}

用“that”这样的词:

void specializeAsLionZoo() {
  LionMaker maker = new LionMaker();
  Lion newLion = zoo.importAnimal(maker);
}

相关问题