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

时间:2011-09-14 00:27:08

标签: 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;
}

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

我怎样才能用Java做到这一点?

3 个答案:

答案 0 :(得分:10)

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

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

考虑调用代码的外观,我想你会明白为什么实际上更简单一致。

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

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

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

public String getSingleValue()
{
    // Throws an exception if there's more than one
}

后者可以 通过前一种方法,或者可能针对期望(和验证)单一结果的情况进行优化。

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

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

答案 1 :(得分:5)

没有

如果有可能,您如何使用返回值?你会将它分配给哪种类型?

XXX foo = getValue(keyName);
^^^
What goes here?

答案 2 :(得分:3)

我参与的一个项目必须处理类似的事情。有一些类似地图的物体。每个键都有零个或多个值。但是有一些关键我们知道只有一个值。其他人最多只有一个。其他人有零或更多。

我们通过引入Collection的扩展程序来解决这个问题:

public class CardinalityException extends RuntimeException {
  ...
}

public interface Values<T> extends Collection<T> {

  /**
   * @return the equivalent of iterator().next() if size() == 1
   * @throws CardinalityException if collection is empty 
   *         or contains more than one element.
   */
  T unique() throws CardinalityException;

  /**
   * @return one element from the collection, or null if empty
   */
  T one();
}

基本上,我们总是返回Values<T>。如果调用者知道只有一个值,则只需使用unique()one(),具体取决于值是否有效。

对于值的数量不重要的情况,我们只保留包装形式的值。