对于这种情况,我更喜欢使用类似于函数式编程阵营中的Maybe/Option模式。你最终会得到一个接口,如下:
public abstract class DoubleOrString
{
public boolean isDouble();
public boolean isString();
public String getString();
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();}
};
}
}
这对客户来说是一种强制性的要求,因为必须在适当的时间进行双倍或字符串的检查。在您的情况下,我会制作一个get()方法,这样当客户端(认为他们)知道类型时,调用就是
objectName.get(5).getString()
在你的get(int)方法中,不要返回字符串或双精度浮点数,而是使用以下返回语句。
DoubleOrString.wrap(theThingToReturn)
这需要一些额外的工作量,但它曾经多次为我带来了回报。
下面是如何使用它来构建一个(警告 - 它没有接近编译器)
public static DoubleOrString parseADoubleOrString(String input) {
try {
return DoubleOrString.wrap(Integer.parseInt(input))
} catch (NumberFormatException nfe) {
return DoubleOrString.wrap(input);
}
}
以下是客户端的样子:
String input = //get the input from the user somehow
DoubleOrString parsed = parseADoubleOrString(input);
if (parsed.isDouble())
aFunctionThatTakesADouble(parsed.getDouble());
else
aFunctionThatTakesAString(parsed.getString());
double d = x.get()
? - trusktrdouble d = (Double) x.get();
。当然,类型转换可能会抛出未检查的异常。 - Stephen C