gpt4 book ai didi

java - 如何强制 Java 接受方法调用的参数之一的条件类型?

转载 作者:行者123 更新时间:2023-11-30 05:59:50 24 4
gpt4 key购买 nike

这个问题很难表述,所以我将不得不使用一些代码示例。基本上,我有一个采用 3 个参数的(重载)方法,我重载了最后一个参数。例如,有时最后一个参数是 String,有时是 double 等。我想使用三元条件表达式作为最后一个参数来调用此方法,以便根据某个值,它将传递一个 double 值或一个字符串。这是一个例子...

重载方法头:

writeToCell(int rowIndex, int colIndex, double value)

writeToCell(int rowIndex, int colIndex, String value)

我正在尝试做的事情:

writeToCell(2, 4, myValue != null ? someDouble : someString);

然而,这会导致编译错误:

The method writeToCell(int, int, double) in the type MyType is not applicable 
for the arguments (int, int, Object&Comparable<?>&Serializable)

似乎 Java 不够“聪明”(或者只是没有有意内置的功能),无法意识到任一选项都有支持它的方法。我的问题是 - 有什么办法可以做到这一点?我知道我可以通过将 double 作为字符串传递来模拟它(例如 writeToCell(2, 4, myValue != null ? someDouble.toString() : someString);),但是方法需要将其作为 double 据类型接收。

逻辑告诉我,没有办法强制 Java 接受这个声明...但值得一试,因为它会为我带来更清晰的代码。任何人都知道这样做的方法......?

最佳答案

方法调用是在编译时静态解析的,而不是在运行时动态解析的。因此,编译器正在寻找与该表达式中的两个可能参数匹配的类型,如您所见。

您可以做 SDK 经常做的事情,并将您的方法定义为

writeToCell(int rowIndex, int colIndex, Object value)

然后第一行是

final String repr = String.valueOf(value);

还有很多其他解决方案,但最好不要想太多。

演示:

static class WrongAgain
{
void frob(final Object o)
{
System.out.println("frobo " + o);
}

void frob(final String s)
{
System.out.println("frobs " + s);
}

}

public static void main(final String[] args)
{
final WrongAgain wa = new WrongAgain();
wa.frob("foo");
Object o = "foo";
wa.frob(o);
}

如果方法查找是动态的,那么您两次都会看到“frobs”。它是静态的。

关于java - 如何强制 Java 接受方法调用的参数之一的条件类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382209/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com