对valueOf的引用是不明确的

时间:2015-03-30 22:51:54

标签: java ambiguous

我遇到了import static java.lang.Float.*;,请注意static(实际上是import static java.lang.Math.*,但旁边)。我以前从未见过它,并认为它非常有用,Float.valueOf("1.234f");变为valueOf("1.234f")

但是当我添加import static java.lang.Integer.*;时,我收到一条错误消息:"reference to valueOf is ambiguous",因为这两个类都有(静态)方法。

没有办法吗?我可以在它模糊不清的地方使用它只有一段时间吗?

旁注:

这种情况与我们为什么只能extend一个类的背景相同,因为如果我们可以extend两个类,对于所有静态字段等,命名可能会导致同样的问题吗? / p>

4 个答案:

答案 0 :(得分:5)

如您所知,在静态导入静态方法时,无需引用Float来访问静态方法。但由于Float.valueOf(String string)Integer.valueOf(String string)都可用,编译器如何知道在调用valueOf(String string)时是否需要浮点值或整数值?

编译器仅匹配方法名称和签名:“valueOf”和单个字符串参数。它没有看到你的字符串中有小数点和f:这就是valueOf的作用。

要解决歧义,请拨打Float.valueOf("1.234f")Integer.valueOf("1234")

答案 1 :(得分:2)

这两个类已经为你导入了,所以只需要明确地调用不明确的方法:

Float.valueOf(arg); // or Integer.valueOf(arg);

答案 2 :(得分:0)

关于“旁注”: 恕我直言,最好在一个新问题中提问你的旁注,但要回答: 不,这是一个非常不同的事情。 Java决定不允许多重继承来避免diamond problem

  • C ++确实允许它,但这是该语言被认为复杂的原因之一。
  • Scala也允许它(称为traits)并通过继承顺序解决钻石问题以解决问题。 Read this good post explaining it

答案 3 :(得分:0)

这与两个具有相同名称的不同类(在不同的包中)没有什么不同。只能输入1,必须使用完全限定名称引用另一个。