gpt4 book ai didi

java - 检查 T 的实例并有条件地调用相应的构造函数

转载 作者:行者123 更新时间:2023-12-02 06:28:14 24 4
gpt4 key购买 nike

我正在使用下面的代码,但让我首先解释一下我想要实现的目标。我有3节课,Publisher , Consumer ,和Broker 。我想创建一个静态方法,它接受来自 CLI 的参数并根据我指定的内容返回每个类的列表。下面的示例功能齐全,但仅适用于 Publisher类(class)。我的问题是,如何修改以下代码以接受多个类并返回 List< T >而不是List< Publisher > 。我尝试过使用泛型,但这样,我无法调用构造函数来创建新对象。不要担心字符串分割,这与问题无关,主要焦点是在我实例化对象的 while 循环内。我的目标是以这种方式使用这个类

ArgParser.< Publisher >fetchEntitiesFromCommandLine(args)

ArgParser.< Broker > fetchEntitiesFromCommandLine(args)

ArgParser.< Consumer > fetchEntitiesFromCommandLine(args)

提前致谢!

public class ArgParser {
public static List<Publisher> fetchPublishersFromCommandLine(String[] args) throws IllegalArgumentException {
List<Publisher> publishers = new ArrayList<>();
int position = -1;
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-p")) {
position = i;
}
}
if (position == -1)
throw new IllegalArgumentException();
try {
while (args[++position] != null) {
String[] data = args[position].split(":");
Publisher publisher = new Publisher(data[0], Integer.parseInt(data[1]));
publishers.add(publisher);
}
// This line never executes, however compiler warned me.
throw new IndexOutOfBoundsException();
} catch (IndexOutOfBoundsException err) {
return publishers;
}
}
}

最佳答案

对于包含多种类型的列表,它们应该有一个共同的父类(super class)或接口(interface)(如果您不想恢复为 List<Object> )。
关于泛型类型新实例的实例化T :必须获取实例的具体类。如果我理解正确的话,具体类型可以从运行时参数确定。这里有两个选项

  1. 解析参数并确定具体类型后,使用 switch-case 并查询每个可能的值。下面的代码假设有一个接口(interface) Person所有可能的具体类型都实现:

    List<? extends Person> returnList = new ArrayList<>();
    String personType = determinePersonTypeFromArgs(args);
    Person person = null;
    switch (personType) {
    case "publisher" :
    person = new Publisher(...);
    case "bromer" :
    person = new Broker(...);
    case "consumer" :
    person = new Consumer(...);
    }
    if (person != null) returnList.add(person);
    return returnList;

    这是一个相对简单的解决方案。然而,引入了一种新型Person需要更改代码,并且更有可能出现拼写错误等错误。

  2. 使用反射实例化具体 Person 。在这种情况下,String必须包含准确的完整类名(包括包),并且必须根据arg类型获取构造函数。简而言之 - 更复杂的样板代码。然而,它更具可扩展性和弹性。

关于java - 检查 T 的实例并有条件地调用相应的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55773208/

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