投射到按钮是多余的 - 为什么?

时间:2012-03-01 10:32:32

标签: android button casting findviewbyid

我刚刚从编译器中看到了这个有趣的消息,我不知道它为什么会发生。这是案例

示例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返回的对象初始化另一个对象,为什么不需要强制转换。

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

findViewById()始终返回View,它是所有视图的父级,例如ImageView,Button ...

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

发生这种情况是因为您不需要将View投射到Button,以便拨打setOnClickListener中定义的View。完成findViewById(R.id.someButtonId).setOnClickListener(this);

就足够了

答案 4 :(得分:0)

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