【问题标题】:Why am I receiving this error message when using "this" as a method parameter in Java?为什么在 Java 中使用“this”作为方法参数时会收到此错误消息?
【发布时间】:2019-01-15 17:01:59
【问题描述】:

我最近读到this 是一个局部变量,它包含当前对象的引用 ID,可以在任何实例函数中使用。但是,当我将 this 明确声明为 int 参数时,我收到编译时错误消息:“接收器类型与封闭类类型不匹配”。

class ThisDemo
{
    void show(int this)
    {
        System.out.println(this);
    }
}
class ThisDemo1
{
    public static void main(String... s)
    {
        ThisDemo a=new ThisDemo();
        int x=10;
        a.show(x);
    }
}

【问题讨论】:

  • 请注意,声明一个名为this的(接收者)参数实际上是有效的。它必须是正确的类型。 ideone.com/WTGOV1

标签: java this


【解决方案1】:

你可能会被错误信息弄糊涂

接收器类型与封闭类类型不匹配

根据其他答案,您不应该将this 用作参数(或将其声明为新变量),但错误消息说明的内容完全不同。

其实你可以使用this作为参数,但是只有一个地方:a receiver parameter

receiver 参数是实例的可选句法设备 方法或内部类的构造函数。对于实例方法, 接收器参数表示该方法所针对的对象 调用。对于内部类的构造函数,接收器参数 表示新构造的直接封闭实例 目的。在这两种情况下,receiver 参数的存在仅仅是为了允许 要在源代码中表示的表示对象的类型,所以 类型可以被注释(§9.7.4)。接收器参数不是 形式参数;更准确地说,它不是任何声明 一种变量(§4.12.3),它永远不会绑定到任何传递的值 方法调用表达式或类实例中的参数 创建表达式,并且在运行时没有任何作用。

实际上,它看起来像

class ThisDemo
{
    void show(@Special ThisDemo this)
    {
        System.out.println(this);
    }
}

然后你可以通过正则反射的方式提取@Special注解。

【讨论】:

  • 你为什么要这么做?我认为鼓励人们使用反模式是不好的。永远不要命名任何东西this。此外,您仍然无法在 Java 7 和更早版本中执行此操作。
  • @aBnormaLz:这不是反模式……这似乎是一种特殊情况。它是在 Java 8 中明确添加的,因此说它在 Java 7 中不存在是没有实际意义的,类似于流在 Java 7 中不存在的方式。
  • @aBnormaLz 是的,我不明白你为什么称它为反模式。专门引入此功能是为了允许开发人员注释接收器实例。例如,这可以在面向方面的编程库中使用。或者一些静态分析工具。
  • @aBnormaLz 另外,我不是在争论你是否应该永远这样做,我的回答只是解释了错误消息及其所指的内容。
【解决方案2】:

您不能使用this 来命名您的变量,因为它是Java 中的保留关键字。 this 指的是您当前的对象(在您的情况下是类ThisDemo 的对象)。我想你想要达到的目标如下:

class ThisDemo
{
    void show()
    {
        System.out.println(this);
    }
}
class ThisDemo1
{
    public static void main(String... s)
    {
        ThisDemo a=new ThisDemo();
        a.show();
    }
}

【讨论】:

  • 这里一个明确的情况,您可以使用this 作为变量的名称。参考 Savior 的回答,其中还谈到了接收器参数(这是 this 的唯一其他用例)。
【解决方案3】:

this 是一个关键字,表示方法或对象的当前实例。它用于指代它所属的对象。

因此,将人体视为一个类别。因为对象的实例可能被称为不同的东西,比如 John 或 Kyle,当你在一个方法中引用一个通用的人时,你会使用它。例如,要获得任何人的心跳,您可以使用 this.getHeartbeat()。

希望这可以帮助您将其概念化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多