Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何根据方法的环境返回字符串或double?可能吗?_Java_Methods_Return Value_Overloading_Return Type - Fatal编程技术网

在Java中,如何根据方法的环境返回字符串或double?可能吗?

在Java中,如何根据方法的环境返回字符串或double?可能吗?,java,methods,return-value,overloading,return-type,Java,Methods,Return Value,Overloading,Return Type,例如,我有一个方法,它在字符串中查找由指定的删除器分隔的数据,但某些项可能是名称,而其他项可能是数字 如果用户调用我的方法从取消列表返回项目编号X,我希望它在项目X是名称时返回字符串,或者在项目X是数字时返回双精度 例如,objectName.get(5)将获得删除列表中的第5项 我需要为此使用某种类型的重载吗 或者我必须做一些类似于objectName.getDouble(5)的事情和objectName.getString(5)基于用户知道第5项是什么的事实 但是如果用户不知道第5项是什么呢

例如,我有一个方法,它在字符串中查找由指定的删除器分隔的数据,但某些项可能是名称,而其他项可能是数字

如果用户调用我的方法从取消列表返回项目编号X,我希望它在项目X是名称时返回字符串,或者在项目X是数字时返回双精度

例如,
objectName.get(5)将获得删除列表中的第5项

我需要为此使用某种类型的重载吗

或者我必须做一些类似于
objectName.getDouble(5)的事情
objectName.getString(5)基于用户知道第5项是什么的事实


但是如果用户不知道第5项是什么呢?他只需要一个字符串或一个双精度字符,具体取决于它是什么。

这里有一种方法:

public Object get() {
    if (blueMoon) {
        return new Double(42.0);
    } else {
        return "fred";
    }
}
请注意,这将返回一个
Double
包装,而不是
Double

不过,我认为这不是一个好主意,因为调用方现在必须测试返回值的类型,并执行类型转换来处理它


作为记录,Java不允许方法返回
字符串
双精度
,因为这些类型在Java类型系统中没有公共超类型。

Java语言不会在方法的返回类型上公开重载。(正如Thilo指出的,这是Java语言的限制,而不是JVM/字节码的限制。)


通常,这种类型的东西不适合Java类型系统。我们可以想象返回
类型(Stephen C建议的比
对象
更受限制的返回类型,B.Bear指出的比DoubleOrString更通用的返回类型),但在Java中使用这种构造所需的一般努力通常只会导致有多个方法,例如
getString(…)
getDouble(…)

对于这类事情,我更喜欢使用类似于函数式编程阵营中的Maybe/Option模式的东西。您最终得到的界面如下:

public abstract class DoubleOrString 
{
    // Constraint isDouble() xor isString()
    public boolean isDouble();
    public boolean isString();

    //Must throw iff !isString()
    public String getString();

    //Must throw iff !ifDouble()
    public Double getDouble();

    public static DoubleOrString wrap(final double wrapMe)
    {
       return new DoubleOrString()
       {
             public boolean isDouble() {return true;}
             public boolean isString() {return false;}
             public Double getDouble() {return wrapMe;}
             public String getString() {throw new RuntimeException();}
       };
    }

    //same for wrap(String)
}
这就给客户端带来了一个问题,因为总是有一个健全的检查,在适当的时间确实有一个double或String。在您的情况下,我只会创建一个get()方法,因此当客户端(认为他们)知道类型是什么时,调用就被取消了

objectName.get(5).getString();
在get(int)方法中,return语句不是返回字符串或double,而是

DoubleOrString.wrap(theThingToReturn)
  String input = //get the input from the user somehow
  DoubleOrString parsed = parseADoubleOrString(input);
  if (parsed.isDouble())
      aFunctionThatTakesADouble(parsed.getDouble());
  else
      aFunctionThatTakesAString(parsed.getString());
这是一点额外的工作,但它已经支付了我在过去几次

下面是如何使用它构建一个(警告-这还没有接近编译器)

这是客户的样子

DoubleOrString.wrap(theThingToReturn)
  String input = //get the input from the user somehow
  DoubleOrString parsed = parseADoubleOrString(input);
  if (parsed.isDouble())
      aFunctionThatTakesADouble(parsed.getDouble());
  else
      aFunctionThatTakesAString(parsed.getString());

如果您需要这样做,那么您的设计就有问题。因为原始数据源是字符串,所以您必须接受所有返回值都是字符串,并将其留给客户端检查结果是否可以转换为数字

如果要避免客户端执行检查,可以为其提供一个最小的API,该API可能类似于:

public class ValueExtractor {

    public ValueExtractor(String delimitedText) {
        // ...
    }

    /**
     * Determines whether there is a next element
     * to be returned
     */
    public boolean next() {
        // ...
    }

    public String get() {
        // ...
    }

    /**
     * Returns the value as a Double if possible
     * null otherwise.
     */
    public Double getPossibleDouble() {
        // ...
    }
}

这很有趣!但是我不明白你的第二个语句…我总是返回字符串和双精度。你是说如果返回类型是“Object”,就不能返回字符串或双精度?如果返回类型是Object,则可以从此方法返回从Object基类继承的任何内容。问题是调用方不知道返回的类型,因此调用方必须进行类型检查和强制转换,才能从返回值中获得任何有用的内容。这没有错,但可能是c更简洁的方法。@trusktr-否。我的意思是,如果获取值的代码需要根据其类型对其执行某些操作,那么它必须对其进行类型转换。显然,有些事情并不取决于返回对象的类型;例如,分配给另一个
对象
变量,或者调用
toString()
@trusktr:I也“未命中”PHP在复杂应用程序中的运行时令人惊讶:)@trusktr:no-unbox在没有类型转换的情况下无法工作。所以
double d=(double)x.get()。当然,类型转换可能会抛出一个未经检查的异常。我只想能够得到它是什么,而不需要一开始就知道返回类型。@trusktr-这是假设的。“Java语言不会在方法的返回类型上公开重载。”然而,JVM确实支持此功能。@Thilo是这样吗?有什么办法可以利用它吗?哇,看起来很有趣。我以前从未见过这样的构造。你能编辑一下答案来解释一下它是如何工作的吗?我想如果你尝试编译它,然后在调试器中使用它,你会从中得到更多。你想解释哪一点?在你的问题中没有太多的上下文要解释。我想我只是不太懂Java,甚至不知道该问什么。我只学了4周JAVA。不过我一定会把这个放在手边。现在,我只是输出字符串,让客户转换成双精度,如果他愿意的话。Burleigh Bear,我从来没有机会尝试这个。。。我确信我甚至知道如何使用这门课。你能发布一个使用示例吗?+1:“如果你需要这样做,那么你的设计就有问题了。”