【问题标题】:Java method return type acceptable for method argument [...] [duplicate]方法参数可接受的Java方法返回类型[...] [重复]
【发布时间】:2019-08-30 17:07:32
【问题描述】:

以下方法签名:

public void doSomeStuff(Foo ... names){

}

现在假设我有一个List<String> names,我想将其转换为Foos,然后我可以将其传递给doSomeStuff()

因为创建所有Foos的方法会很方便,所以我考虑实现一个方法如下:

public Foo[] createFoos(List<String> names){
    Foo[] foos = new Foo[names.size()];
    //create all the Foo's and pass them into array
    return foos;
}

最后我想要这样的代码(我有一些来自其他来源的Foos,或者它们确实需要特殊处理):

doSomeStuff(foo1, foo2, createFoos(names));

所以问题是,是否有可能实现一个方法 (createFoos()),它返回一个被带有 Foo ... names 签名的方法接受的对象,如果是这样,人们将如何去做?


对不起,如果这是重复的,我找不到关于这个主题的任何内容

编辑:

正如我刚刚意识到的那样,要求有点不同。很抱歉造成混乱。更新了方法调用。

关键部分是我需要传入一些来自其他来源/不是由createFoos() 方法创建的Foos

【问题讨论】:

  • “遗憾的是,Foo[] 不是 Foo ... 名称所接受的返回类型”Yes it is
  • “遗憾的是,Foo[] 不是 Foo ...names 接受的返回类型”:这是不正确的。数组是 var-arg 参数的有效参数。你真的试过了吗?
  • 我更新了要求。我忘记了一个非常关键的部分

标签: java


【解决方案1】:

将这些额外的 foo1foo2 移到 createFoos 方法中

public Foo[] createFoos(List<String> names, Foo... extraFoos){
    Foo[] foos = new Foo[names.size() + extraFoos.length];
    //create all the Foo's and pass them into array
    return foos;
}

这样称呼

doSomeStuff(createFoos(names, foo1, foo2));

或者,返回一个列表,然后附加到它,最后将它变成一个数组。

public List<Foo> createFoos(List<String> names){
    List<Foo> foos = new ArrayList<>();
    //create all the Foo's and pass them into array
    return foos;
}

用法:

List<Foo> foos = createFoos(names);
foos.add(foo1);
foos.add(foo2);
doSomeStuff(foos.toArray(new Foo[0]));

【讨论】:

  • 在这个答案的帮助下,我设法完全清理了我的代码(仍然不是最好的,但要好得多)。最后,我创建了另一种方法,只需将现有的Foos 转换为List&lt;Foo&gt;
【解决方案2】:

您也可以将createFoos()方法的返回类型改为List,并使用Arrays类方法Arrays.asList()将数组转换为List

public List<string> createFoos(List<String> names){
    Foo[] foos = new Foo[names.size()];
    //convert Array into List 
   List<String> foosList = (List<String>) Arrays.asList(foos);
    return foosList;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 2017-05-09
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多