java的一个函数可以在不同的条件下返回两种类型吗?

oys*_*yss 1 java string function

public String[] getValue(String keyName) {

    ArrayList arraylist = (ArrayList) value.get(getKey(keyName));

    String[] valueArray = new String[arraylist.size()];

    for (int i = 0; i < valueArray.length; i++)
        valueArray[i] = arraylist.get(i).toString();

    return valueArray;
}
Run Code Online (Sandbox Code Playgroud)

我想修改此功能以使其更易于使用.如果返回String数组只包含一个元素.我希望它以String(非String数组)类型返回.

我怎么能用Java做到这一点?

Jon*_*eet 10

好吧,你可以声明该方法返回Object而不是String[]......但这使得它更难以使用,而不是更容易.

  • 您不能声明方法可以返回类型X 类型Y,除非X或Y是另一个的超类型(在这种情况下,也可以返回其他子类型)
  • 您不能声明两种仅在返回类型上有所不同的方法

想想调用代码会是什么样子,我想你会明白为什么实际上更简单一致.

当然,您总是可以创建自己的OneOrMany界面来包含常见的操作,并且可以包含单个元素或多个元素......但同样,我看不到它的好处.(虽然我可以看到返回一个List<String>或一个Iterable<String>而不是一个数组的好处.)

编辑:看过你对Dilum的答案的评论,在调用者期望单个元素的情况下,我会创建帮助方法,允许表示集合或只是有两个方法:

public Collection<String> getValues()
{
    ...
}

public String getSingleValue()
{
    // Throws an exception if there's more than one
}
Run Code Online (Sandbox Code Playgroud)

后者可以要么通过前者的方法中去,或可能为期望(和验证)的单个结果的情况下被优化.

这样,在调用代码中非常清楚您期望的是什么以及为什么,并且期望得到验证.

我可能不会引入新的接口,因为这意味着我要么必须包装现有的集合类,要么将它们子类化(argh).在C#中很容易,因为你可以使用Single()扩展方法(沿SingleOrDefault,FirstOrDefault等等)...


Oli*_*rth 5

没有.

如果可能的话,你怎么能使用返回值?你会指定什么类型的?

XXX foo = getValue(keyName);
^^^
What goes here?
Run Code Online (Sandbox Code Playgroud)