假设有这么一个需求:在一个函数中传入一个对象,并给出这个对象的类及其一个子类,如果这个对象是其子类的实例,那么就执行子类的方法,如果不能强转那么就执行这个父类本身的方法。或者这样的需求:还是给出一个对象,但是给出类及其子类,要求为了代码可读性将子类方法和父类方法分开写。下面是一个泛型写法。以imageView及其父类View为例。首先是几个接口
interface CallbackHaha<E extends T,T> {
public T parentMethod(T t);//如果传入一个父类,如果强转成功,则既执行子类代码,又执行父类代码,如果强转失败,则只执行父类代码
public E childMethod(E e);//如果传入一个子类,则既执行子类代码,又执行父类代码
}
public <T, E extends T> void childCall(E e,CallbackHaha<E,T> callbackHaha){
T t=callbackHaha.parentMethod(e);//执行父类的方法(用于代码分离)
e=callbackHaha.childMethod(e);//执行子类特有的方法
}
public <T, E extends T> void parentCall(T t,CallbackHaha<E,T> callbackHaha){
try {
E e = (E)t;//把父类强转成其子类
e=(E) callbackHaha.childMethod(e);//如果强转成功
} catch (ClassCastException e) {//如果强转失败
// TODO: handle exception
t=callbackHaha.parentMethod(t);
}
}
调用方法
ImageView imageView1 = (ImageView) findViewById(R.id.imageView1);
//传入一个子类进行处理
childCall(imageView1, new CallbackHaha<ImageView,View>() {
@Override
public ImageView childMethod(ImageView e) {
// TODO Auto-generated method stub
//传入子类自身的处理
e.setImageResource(R.drawable.btn_gengduo_nor);
return e;
}
@Override
public android.view.View parentMethod(android.view.View t) {
// TODO Auto-generated method stub
//把这个子类强转成其父类进行处理(虽然方法多余,但是代码分离的效果也是极好的)
t.setVisibility(View.VISIBLE);
return null;
}
});
//传入一个父类,并试着强转成其某一个子类,并对子类进行处理
parentCall(imageView1, new CallbackHaha<ImageView,View>() {
@Override
public ImageView childMethod(ImageView e) {//如果强转成功
// TODO Auto-generated method stub
e.setImageResource(R.drawable.btn_gengduo_select);
return e;
}
@Override
public View parentMethod(View t) {//如果强转失败
// TODO Auto-generated method stub
t.setVisibility(View.GONE);
return t;
}
});
}