Tuesday, November 3, 2015

泛型与多重继承的关系 Java getGenericSuperclass()和getActualTypeArguments()基本用法:




遇到的问题,在处理的时候 我提取了多次的 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():返回本类的父类,包含泛型参数信息

=========================================

附加 参考链接:

http://blog.csdn.net/hikvision_java_gyh/article/details/10182309

http://blog.csdn.net/u010167086/article/details/15336259


No comments:

Post a Comment