Android 对按钮的强制转换是多余的-为什么?
我刚刚从编译器中看到了这个有趣的消息,我不知道为什么会发生这种情况。情况就是这样 例1Android 对按钮的强制转换是多余的-为什么?,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返回的对象强制转换为按钮。在第二个示例中,我不必强制转换返回的对
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用于任何其他视图,是吗?