Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对按钮的强制转换是多余的-为什么?_Android_Button_Casting_Findviewbyid - Fatal编程技术网

Android 对按钮的强制转换是多余的-为什么?

Android 对按钮的强制转换是多余的-为什么?,android,button,casting,findviewbyid,Android,Button,Casting,Findviewbyid,我刚刚从编译器中看到了这个有趣的消息,我不知道为什么会发生这种情况。情况就是这样 例1 Button test = (Button) findViewById(R.id.someButtonId); test.setOnClickListener(this); 例2 findViewById(R.id.someButtonId).setOnClickListener(this); 在第一个示例中,我需要将findViewById返回的对象强制转换为按钮。在第二个示例中,我不必强制转换返回的对

我刚刚从编译器中看到了这个有趣的消息,我不知道为什么会发生这种情况。情况就是这样

例1

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

findViewById(R.id.someButtonId).setOnClickListener(this);
在第一个示例中,我需要将
findViewById
返回的对象强制转换为
按钮
。在第二个示例中,我不必强制转换返回的对象,因为我没有使用另一个
按钮
类对象。如果我试图通过

((Button)findViewById(R.id.someButtonId)).setOnClickListener(this);
我将得到警告
将findViewById(R.id.someButtonId)强制转换为按钮是多余的

为什么会这样?我并不是在试图消除演员警告。我想了解这背后的逻辑,以及如果我不尝试使用
findViewById
返回的对象初始化另一个对象,findViewById()始终返回所有视图(如ImageView、Button等)的父视图,那么为什么不需要强制转换


setOnClickListener是视图类的一种方法。因此,您可以捕获单击事件,而无需将其强制转换为按钮。我认为只有它表示冗余。

我猜setOnClickListener()是视图中的一个方法,而不是按钮,因此是的:强制转换是冗余的。

原因是在示例1中,您需要显式地查找按钮,因为您正在将其分配给按钮变量


OnClickListener适用于任何类型的视图,因此您不需要将其强制转换为视图的特定子类来为其设置OnClickListener。

之所以发生这种情况,是因为您不需要将
视图
强制转换为
按钮
来调用
视图
中定义的
setOnClickListener
。只需执行
findviewbyd(R.id.someButtonId)

之所以会出现这种情况,是因为
findViewById
返回
View
,并且该类已经定义了方法
setOnClickListener
。这意味着即使不进行强制转换,也可以设置侦听器。因此你的施法是多余的。

@Samir我知道如何移除它:)。我不需要那个。我在问为什么不需要铸造warning@rajesh.adhi使用IntelliJ IDEA,你会的。最好的工具!;):哦,我在使用Eclipse,不管怎样,也谢谢你在这里问:像examp2那样使用它安全吗?为什么你认为它不安全?你在这种情况下担心是错误的。使用父对象是完全正确的。我完全相信,如果您访问了正确的接口方法,您不会觉得做了坏事。但这与访问父类的方法的情况相同。毕竟,您实际上总是调用
按钮的方法,只是调用的“字符串”不同而已。首先,您应该更加熟悉多态性的编程概念-@Isaac-confirm。一切都变好了:)热烈欢迎我们Android开发者:)绝对。无论在示例2中找到什么视图,都可以在其上设置OnClickListener。无论如何,您肯定知道它是一个按钮,因为您不会将id someButtonId用于任何其他视图,是吗?