java的一个函数能否在不同的条件下返回两种类型? public String[]getValue(String keyName){ ArrayList ArrayList=(ArrayList)value.get(getKey(keyName)); String[]valueArray=新字符串[arraylist.size()]; 对于(int i=0;i
我想修改此函数以使其更易于使用。 如果返回字符串数组只包含一个元素,我希望它以字符串(而不是字符串数组)类型返回 在Java中如何实现这一点?否 如果可能,您将如何使用返回值?您会将其分配给哪种类型java的一个函数能否在不同的条件下返回两种类型? public String[]getValue(String keyName){ ArrayList ArrayList=(ArrayList)value.get(getKey(keyName)); String[]valueArray=新字符串[arraylist.size()]; 对于(int i=0;i,java,string,function,Java,String,Function,我想修改此函数以使其更易于使用。 如果返回字符串数组只包含一个元素,我希望它以字符串(而不是字符串数组)类型返回 在Java中如何实现这一点?否 如果可能,您将如何使用返回值?您会将其分配给哪种类型 public String[] getValue(String keyName) { ArrayList arraylist = (ArrayList) value.get(getKey(keyName)); String[] valueArray = new String[ar
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;
}
没有
如果可能,您将如何使用返回值?您会将其分配给哪种类型
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;
}
好的,您可以声明该方法返回
Object
而不是String[]
。。。但这使得它更难使用,而不是更容易
- 不能声明方法可以返回类型X或类型Y,除非X或Y是另一个的超类型(在这种情况下,也可以返回其他子类型)
- 不能声明两个只在返回类型上不同的方法
OneOrMany
接口,该接口封装了常见的操作,可以有单个元素,也可以有多个元素。。。但是,我还是看不到好处。(我可以看到返回列表
或Iterable而不是数组的好处。)
编辑:看到您对Dilum答案的评论后,在调用者期望使用单个元素的情况下,我将创建允许对集合表达该元素的帮助器方法,或者只创建两个方法:
XXX foo = getValue(keyName);
^^^
What goes here?
public集合getValues()
{
...
}
公共字符串getSingleValue()
{
//如果存在多个异常,则引发异常
}
后者可以通过前一种方法,也可以针对预期(和验证)单一结果的情况进行优化
这样,在调用代码中就可以非常清楚地知道您期望的是什么以及为什么,并验证该期望
我可能不会引入新的接口,因为这意味着我要么必须包装现有的集合类,要么必须对它们进行子类化(argh)。在C语言中,这很简单,因为您可以使用Single()
扩展方法(以及SingleOrDefault
,FirstOrDefault
等)那么,您可以声明该方法返回对象,而不是字符串[]
。。。但这使得它更难使用,而不是更容易
- 不能声明方法可以返回类型X或类型Y,除非X或Y是另一个的超类型(在这种情况下,也可以返回其他子类型)
- 不能声明两个只在返回类型上不同的方法
想想调用代码是什么样子,我想你会明白为什么一致性实际上更简单
当然,您可以创建自己的OneOrMany
接口,该接口封装了常见的操作,可以有单个元素,也可以有多个元素。。。但是,我还是看不到好处。(我可以看到返回列表
或Iterable而不是数组的好处。)
编辑:看到您对Dilum答案的评论后,在调用者期望使用单个元素的情况下,我将创建允许对集合表达该元素的帮助器方法,或者只创建两个方法:
XXX foo = getValue(keyName);
^^^
What goes here?
public集合getValues()
{
...
}
公共字符串getSingleValue()
{
//如果存在多个异常,则引发异常
}
后者可以通过前一种方法,也可以针对预期(和验证)单一结果的情况进行优化
这样,在调用代码中就可以非常清楚地知道您期望的是什么以及为什么,并验证该期望
我可能不会引入新的接口,因为这意味着我要么必须包装现有的集合类,要么必须对它们进行子类化(argh)。在C语言中,这很简单,因为你可以使用Single()
扩展方法(以及SingleOrDefault
,FirstOrDefault
等)我参与的一个项目必须处理类似的问题。有一些像地图一样的物体。每个键都有零个或多个值。但有些关键点我们知道只有一个值。其他人最多只有一个。其他人则为零或更多
我们通过向集合
引入一个扩展来解决这个问题:
public Collection<String> getValues()
{
...
}
public String getSingleValue()
{
// Throws an exception if there's more than one
}
公共类CardinalityException扩展了RuntimeException{
...
}
公共接口值扩展集合{
/**
*@返回迭代器()的等效值。如果size()=1,则返回next()
*@如果集合为空,则抛出CardinalityException
*或包含多个元素。
*/
T unique()抛出基数异常;
/**
*@从集合中返回一个元素,如果为空,则返回null
*/
T一();
}
因此,本质上,我们总是返回一个值
。如果调用者知道只有一个值,它只需使用unique()
或one()
,这取决于是否没有有效的值
对于值的数量不重要的情况,我们只是以包装的形式保存值。我参与的一个项目必须处理类似的问题。有一些像地图一样的物体。每个键都有零个或多个值。但有些关键点我们知道只有一个值。其他人最多只有一个。其他人则为零或更多
我们通过向集合
引入一个扩展来解决这个问题:
public Collection<String> getValues()
{
...
}
public String getSingleValue()
{
// Throws an exception if there's more than one
}
公共类CardinalityException扩展了RuntimeException{
...
}
公共接口值扩展了Collec