遇到的问题,在处理的时候 我提取了多次的 BaseActivity. 结构是这样子的
DetailQRcodeActivity extends BaseQRcodeActivity
BaseQRcodeActivity extends CaptureActivity
CaptureActivity extends BaseActivity<SingleControl>
private void controlInit() { Class<?> clazz; clazz = mReferenceObj.getClass(); generateControl(clazz); if (mControl == null) { generateControl(clazz.getSuperclass()); } }
上面的处理方式:
1 mReferenceObj 是 DetailQRcodeActivity instance. 所以第一次调用 generateControl()
之后 mControl == null.
2 mReferenceObj,getSuperClass() 直接父类。也就是 BaseQRcodeActivity,这个时候调用
generateControl() 因为BaseQRcodeActivity extends CaptureActivity, 并没有泛型 的信息。也就是没有 SingleControl 类.
所以 此时 mControl == null ,这是为什么呢? 原来是因为泛型在继承的时候 之影响到 她的直接子类的信息。也就是他只会影响到CaptureActivity, 而对于她的孙子 BaseQRcodeActivity, 自然就 心有余而力不足啦!解决方案也就出来了, 第一种方法只解决当前的问题,或者以后每次写这种多继承的时候,需要添加。 第二种方案 从根本上解决问题。 我喜欢第二种。 这是在关联的时候有解决!
So how to reslove this problem?
1 First way:
you can follow this way
DetailQRcodeActivity extends BaseQRcodeActivity
BaseQRcodeActivity extends CaptureActivity< SingleControl >
CaptureActivity <? extends SingleControl > extends BaseActivity<SingleControl>
2 The second way: you can do this way
private void controlInit() { Class<?> clazz; clazz = mReferenceObj.getClass(); generateControl(clazz); if (mControl == null) { generateControl(clazz.getSuperclass()); } if (mControl == null){ generateControl(clazz.getSuperclass().getSuperclass()); } }
in a world I love the second way, because 一劳永逸!
=======================================================
核心代码:
http://blog.csdn.net/hikvision_java_gyh/article/details/10182309
private void generateControl(Class clazz) {
//1 getGenericSuperclass() //通过反射获取当前类表示的实体(类,接口,基本类型或void)的直接父类的Type,
//Type type = this.getClass().getGenericSuperclass();
//是得到这个类的得到泛型父类
Type type = clazz.getGenericSuperclass();
//3 (type instanceof ParameterizedType)),这行代码的意思是
// 如果没有实现ParameterizedType接口,即不支持泛型;
if (type instanceof ParameterizedType) {
ParameterizedType p = (ParameterizedType) type;
//2 getActualTypeArguments()返回参数数组。
//Type[] params = ((ParameterizedType) genType).getActualTypeArguments();这行代码的意思是,如果支持泛型,返回表示此类型实际类型参数的Type对象的数组,数组里放的都是对应类型的Class,因为可能有多个,所以是数组。
Type[] arrayClasses = p.getActualTypeArguments();
for (Type item : arrayClasses) {
if (item instanceof Class) {
Class<T> tClass = (Class<T>) item;
if (tClass.equals(BaseControl.class) || (tClass.getSuperclass() != null
&& tClass.getSuperclass().equals(BaseControl.class))) {
// the same deal with!
messageProxy = new MessageProxy(mHandler);
mControl = ControlFactory.getControlInstance(tClass,
messageProxy);
mModel = new ModelMap();
mControl.setModel(mModel);
return;
}
}
}
}
}
=======================================================
1.Class<? super T> getSuperclass():返回本类的父类
注意: 这里获取的 父类是直接父类奥。这里的继承只有一层的时候是可以的!
2.Type getGenericSuperclass():返回本类的父类,包含泛型参数信息
=========================================
附加 参考链接:
1 http://blog.csdn.net/hikvision_java_gyh/article/details/10182309
2 http://blog.csdn.net/u010167086/article/details/15336259
No comments:
Post a Comment