【问题标题】:reference to valueOf is ambiguous对 valueOf 的引用不明确
【发布时间】:2015-03-30 22:51:53
【问题描述】:

我遇到了: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两个类,对于所有的静态字段等,命名可能会导致同样的问题?

【问题讨论】:

  • 不要静态导入。
  • 您可以根据需要进行静态导入,但如果引用不明确,则必须明确说明您引用的方法。
  • @LouisWasserman 这就是我的想法。旁注呢?
  • “有没有办法解决这个问题?” 是的:从不使用通配符导入。然后只导入你真正需要的东西。
  • @Tom 你的意思是import static java.lang.Float.valueOf;只有你真正需要的东西

标签: java ambiguous


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    这两个类都已经为你导入了,所以只需显式调用 ambiguous 方法:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我会问一个新问题,但它很可能会被标记为重复。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2017-02-04
        • 2014-10-12
        • 2016-10-17
        • 1970-01-01
        • 2023-02-03
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        相关资源
        最近更新 更多