有关JAVA类与类之间的强制类型转换,在android ViewPager里面遇到的。
下面是代码片段:@OverridepublicObjectinstantiateItem(ViewGrouparg0,intarg1){//ObjectViewPager...
下面是代码片段:
@Override
public Object instantiateItem(ViewGroup arg0, int arg1) {
//Object ViewPager;
((ViewPager)arg0).addView(mListViews.get(arg1), 0);
return mListViews.get(arg1);
}
以上是在ViewPager里面改写适配器PagerAdapter 的方法。原理我都能明白,我就是不懂这一句:
((ViewPager)arg0)
不明白为何ViewGroup类型的对象arg0要转换成ViewPager,然后再在外面加一个括号来引用本身就是ViewGroup的方法。我试了直接用arg0.addView(mListViews.get(arg1), 0);也是一样可以的,效果都一样,不知道这里为何要这么用,加这么些括号呢?请JAVA,安卓高手指教,谢谢!
主要就是不明白这里的双层括号有啥用。((ViewPager)arg0) 展开
@Override
public Object instantiateItem(ViewGroup arg0, int arg1) {
//Object ViewPager;
((ViewPager)arg0).addView(mListViews.get(arg1), 0);
return mListViews.get(arg1);
}
以上是在ViewPager里面改写适配器PagerAdapter 的方法。原理我都能明白,我就是不懂这一句:
((ViewPager)arg0)
不明白为何ViewGroup类型的对象arg0要转换成ViewPager,然后再在外面加一个括号来引用本身就是ViewGroup的方法。我试了直接用arg0.addView(mListViews.get(arg1), 0);也是一样可以的,效果都一样,不知道这里为何要这么用,加这么些括号呢?请JAVA,安卓高手指教,谢谢!
主要就是不明白这里的双层括号有啥用。((ViewPager)arg0) 展开
3个回答
展开全部
有时候是不需要转的,但是有时候是必须要转的,比方说你写了一个类A,继承了ViewGroup并且重写了addView方法,但是你重写的addView方法干的事跟ViewGroup不是一件事(比如ViewGroup的addView是增加一个控件,而你重写的addView方法只是打印了一句话而已),只是凑巧名字一样了而已。你传入的对象是A,如果你不强转,那么编译能通过(因为语法没问题啊),但是运行时效果没出来,那你就得费九牛二虎之力去找问题出哪儿了。如果你加上强转呢?就会报类型转换异常,因为A跟ViewPager是没有继承关系的,那问题是不是一下就找到了呢。给你个例子运行一下就知道了。
public class Test {
public static void main(String[] args) {
爹 执行者 = new 小儿子();
Test t1 = new Test();
t1.干大活(执行者);
t1.干小活(执行者);
}
public static void 干大活(爹 执行者) {
//没强转,运行不报错,但活没干了
执行者.干();
}
public static void 干小活(爹 执行者) {
//强转,类型不对就报错,保证活要不被干了,要不就提示说这人不是干活的料
((大儿子)执行者).干();
}
}
class 爹 {
public void 干() {
System.out.println("爹有祖传的方式干活,按这种方式能就能把活干完了...");
}
}
class 大儿子 extends 爹 {
public void 干() {
System.out.println("大儿子有自己的干活方式,跟爹的方式不一样,但是活也干完了...");
}
}
class 小儿子 extends 爹 {
public void 干() {
System.out.println("小儿子挺操蛋的,此干非彼干,正经活没干...");
}
}
展开全部
1、可读性好,不然咋一看不知道这是viewpager。
2、这里目前是只做了add的操作。viewpager的功能肯定是比viewgroup更强大,也许他原来是想调用一些viewpager的方法,后来删掉了只留下这么个。
2、这里目前是只做了add的操作。viewpager的功能肯定是比viewgroup更强大,也许他原来是想调用一些viewpager的方法,后来删掉了只留下这么个。
追问
那请问((ViewPager)arg0) 这里的两个括号,作用分别是什么呢?我就不明白这括号什么用。
追答
1、viewpager那个括号代表强转
2、外层的括号代表强转优先执行,再执行后边调用的方法。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这样就多此一举了,不用管,不转也一样,类型转换还浪费时间
追问
主要是我看到网上这一部分的代码,还有不少视频都是这样写的这一部分,实在是很困惑。
追答
转与不转arg0指向的都是同一个对象,除非用到ViewPager特有的方法必须转,否则可以不用转
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询