【问题标题】:Overloading and Java types concepts重载和 Java 类型概念
【发布时间】:2018-06-18 12:40:19
【问题描述】:
public class Class2 extends Class1{
    public static void main(String[] args) {
        Class2 c2 = new Class2();

        c2.m3(10);
        c2.m3(10.5f);
        c2.m3('a');
        c2.m3(10l);
        c2.m3(10.5);
    }

    public void m2() {
        System.out.println("M1 method of class2");
    }

    public void m3(int i) {
        System.out.println("int argument");
    }

    public void m3(float j) {
        System.out.println("float argument");
    }
}

尝试调用 c2.m3(10.5) 时出错;你能帮忙解释一下为什么会这样吗?

【问题讨论】:

  • "getting error"你得到了什么错误?
  • Class2类型中的方法m3(int)不适用于参数(double)
  • 如果您有任何方法,您也可以显示Class1
  • 那么您的解决方案就在您面前,直接在错误描述中。 10.5是双倍的。该方法需要一个浮点数。
  • 试试c2.m3(10.5f);

标签: java oop types casting overloading


【解决方案1】:

尝试调用 c2.m3(10.5) 时出错;你能帮忙解释一下为什么会这样吗?

这里发生的情况是,当您调用 m3(10.5 时,您将 double 传递给 m3() 方法,而您只有两个接受 int 或 @987654326 的 m3() 方法@,这就是你的问题所在。

只需像这样更改最后一行:

c2.m3((float) 10.5);

您需要将 double 值强制转换为 float 或传递像 10.5f 这样的浮点数。

【讨论】:

    【解决方案2】:

    您使用错误的类型调用该方法:您似乎打算调用此重载:void m3(float j);但不能用10.5 调用。文字10.5double,并且没有采用double 参数的方法重载。

    您应该将调用更改为c2.m3(10.5f) 或添加另一个带有签名void m3(double j) 的重载

    【讨论】:

    • 也可以使用演员表,但这可能会导致精度损失
    • 供参考:§3.10.2 of the JLS 定义所有float 字面量必须以f 为后缀,否则为double 字面量。
    【解决方案3】:

    让我们参考语言规范§5.3 Invocation Contexts:

    松散的调用上下文允许更宽松的转换集, 因为它们仅用于特定调用,如果没有 可以使用严格的调用上下文找到适用的声明。 松散的调用上下文允许使用以下之一:

    • 身份转换 (§5.1.1)
    • 扩大的基元转换 (§5.1.2)
    • 扩大参考转换 (§5.1.5)
    • 装箱转换(第 5.1.7 节)可选地后跟扩大参考转换
    • 拆箱转换(第 5.1.8 节)可选地后跟扩展原语转换

    基本上,当您调用一个方法时,您提供的参数只能进行上述转换之一。

    如果表达式的类型不能转换为 松散调用上下文中允许的转换参数, 然后发生编译时错误。

    您正在尝试从 double10.5double 文字)转换为 float,这是一种缩小的原始转换,在调用上下文中是不允许的。

    10 用作参数,因为允许进行身份转换(从 intint)。

    10.5f 有效,因为它是 float 文字,并且允许进行身份转换(从 floatfloat)。

    'a' 有效,因为这是允许的原始扩展转换(从charint)。

    10l 之所以有效,是因为这也是一种扩大的原始转换(从longfloat)。

    有关转换类型的更多信息,请参阅§5.1

    【讨论】:

    • 得到了答案。谢谢大家和@sweeper
    • @NitQA 如果您认为这些答案对您有所帮助,请考虑通过单击该复选标记来接受您认为最有帮助的答案!
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多