我刚刚从编译器中看到了这个有趣的消息,我不知道它为什么会发生。这是案例
示例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
返回的对象初始化另一个对象,为什么不需要强制转换。
答案 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,所以是的:演员是多余的。