在Java中,如何根据方法的情况返回String或double?可能吗?

tru*_*ktr 3 java methods overloading return-type return-value

例如,我有一个方法,通过字符串查找由指定的分隔符分隔的数据,但有些项可能是名称,其他项可能是数字.

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

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

我是否必须使用某种类型的重载?

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

但是如果用户不知道项目5是什么呢?他只需要一个String或一个Double,取决于它碰巧是什么.

Ste*_*n C 7

这是一种方法:

public Object get() {
    if (blueMoon) {
        return new Double(42.0);
    } else {
        return "fred";
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这将返回一个Double包装器而不是一个包装器double.

我认为这不是一个好主意,因为调用者现在必须测试返回值的类型并进行类型转换以对其执行某些操作.

对于记录,Java不允许方法返回a Stringdouble因为这些类型在Java类型系统中没有公共超类型.

  • @trusktr:我也"错过"PHP在复杂应用程序中的运行时惊喜:) (6认同)
  • 如果返回类型是Object,则可以从此方法返回从Object基类继承的任何内容.问题是调用者不知道你返回了什么类型,因此调用者必须进行类型检查和强制转换以从返回值中获取任何有用的东西.这没有什么不对,但可能有更简洁的方法. (2认同)

Bur*_*ear 6

对于这种事情,我更喜欢使用类似于函数式编程阵营中的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)
}
Run Code Online (Sandbox Code Playgroud)

这会给客户带来问题,因为总有一个完整性检查,确实在适当的时候确实有一个double或String.在你的情况下,我只做一个get()方法,所以当客户端(认为他们)知道类型是什么时,调用是

objectName.get(5).getString();
Run Code Online (Sandbox Code Playgroud)

并且在你的get(int)方法中,返回语句看起来不是返回String或double

DoubleOrString.wrap(theThingToReturn)
Run Code Online (Sandbox Code Playgroud)

这是前期的一些额外工作,但过去曾多次付给我.

以下是如何使用它来构建一个(警告 - 这不是在编译器附近)

public static DoubleOrString parseADoubleOrString(String input) {
    try {
        return DoubleOrString.wrap(Integer.parseInt(input))
    } catch (NumberFormatException nfe) {
        return DoubleOrString.wrap(input);
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是客户的样子

  String input = //get the input from the user somehow
  DoubleOrString parsed = parseADoubleOrString(input);
  if (parsed.isDouble())
      aFunctionThatTakesADouble(parsed.getDouble());
  else
      aFunctionThatTakesAString(parsed.getString());
Run Code Online (Sandbox Code Playgroud)