对 valueOf 的引用不明确

reference to valueOf is 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" 因为这两个 class 都有那个(静态)方法。

有没有办法解决这个问题?在某处模棱两可之前,我只能使用它有限的次数?

旁注:

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

正如您所注意到的,当您静态导入它时,您不需要引用 Float 来访问它的静态方法。但是因为 Float.valueOf(String string)Integer.valueOf(String string) 都可用,所以当您调用 valueOf(String string) 时,编译器怎么知道您想要的是 Float 值还是 Integer 值?

编译器只匹配方法名称和签名:一个 "valueOf" 和一个字符串参数。它没有看到您的字符串中有小数点和 f:这就是 valueOf 所做的。

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

两个类都已经为你导入了,所以只需显式调用模棱两可的方法即可:

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

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

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

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