【问题标题】:Casting to Button is redundant - Why?投射到 Button 是多余的 - 为什么?
【发布时间】:2012-03-01 10:32:32
【问题描述】:

我刚刚从编译器中看到这条有趣的消息,但我不知道为什么会这样。是这样的

示例 1。

Button test = (Button) findViewById(R.id.someButtonId);
test.setOnClickListener(this);

示例 2。

findViewById(R.id.someButtonId).setOnClickListener(this);

在第一个示例中,我需要将findViewById 返回的对象强制转换为Button。在第二个示例中,我不必强制转换返回的对象,因为我没有使用另一个 Button 类对象。如果我尝试通过

投射它
((Button)findViewById(R.id.someButtonId)).setOnClickListener(this);

我会收到警告Casting findViewById(R.id.someButtonId) to Button is redundant

为什么会这样?我不是要删除演员警告。我想了解这背后的逻辑,以及如果我不尝试使用findViewById 返回的对象初始化另一个对象,为什么不需要强制转换。

【问题讨论】:

  • @Samir 我知道如何删除它:)。我不需要那个。我在问为什么不需要强制转换。
  • :( 我没有收到警告
  • @rajesh.adhi 使用 IntelliJ IDEA,你会的。最好的工具! ;)
  • :我正在使用 Eclipse,谢谢

标签: android button casting findviewbyid


【解决方案1】:

你得到这个的原因是因为findViewById返回View并且这个类已经定义了方法setOnClickListener。这意味着即使不进行强制转换,您也可以设置侦听器。因此,您的演员阵容是多余的。

【讨论】:

  • 在这里也要问:像在examp2中那样使用它安全吗?
  • 你为什么认为它不安全?
  • 你在这种情况下是错误的。使用父对象非常好。我完全确定,如果您正确访问接口方法,您不会想做坏事。仍然与访问父类的方法相同。毕竟实际调用Button的方法总是如此,只是调用的“字符串”不同而已。
  • @sandalone,你应该多熟悉多态的编程概念-docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
  • @Isaac 已确认。事情变得更好了 :) 热烈欢迎我们的 Android 开发者 :)
【解决方案2】:

findViewById() 总是返回 View,它是所有 View 的父 View,例如 ImageView、Button...

setOnClickListener 是 View 类的一个方法。因此,您可以简单地捕获点击事件,而无需将其转换为 Button。我认为只有它说的是多余的。

【讨论】:

    【解决方案3】:

    原因是在示例 1 中,您明确需要找到一个 Button,因为您将它分配给一个 Button 变量。

    OnClickListener 适用于任何类型的 View,因此您无需将其强制转换为 View 的特定子类即可为其设置 OnClickListener。

    【讨论】:

    • 当然。无论在示例 2 中找到什么 View,都可以在其上设置 OnClickListener。
    • 无论如何你肯定知道它是一个按钮,因为你不会将 id someButtonId 用于任何其他视图,对吗?
    【解决方案4】:

    发生这种情况是因为您无需将 View 转换为 Button 即可调用在 View 中定义的 setOnClickListener。够了findViewById(R.id.someButtonId).setOnClickListener(this);

    【讨论】:

      【解决方案5】:

      我猜 setOnClickListener() 是 View 而不是 Button 中的一个方法,所以是的:演员表是多余的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        相关资源
        最近更新 更多