view src/main/java/christie/datagear/dg/DataGear.java @ 215:3bddbfd6ea02

fix command builder
author akahori
date Tue, 12 Mar 2019 21:51:14 +0900
parents 3ce77273d76b
children
line wrap: on
line source

package christie.datagear.dg;

import christie.datagear.WrapperClass;

public class DataGear<T>{
    protected T data = null;
    protected Class<T> clazz = null;

    public DataGear(T data) {//for normal
        setClazz(data.getClass());
        setData(data);
    }

    /*public DataGear(T... dg) {//for input DataGear init
        @SuppressWarnings("unchecked")
        Class<T> type = (Class<T>) dg.getClass().getComponentType();
        this.clazz = type;
    }*/

    public DataGear(Class clazz){
        setClazz(clazz);
    }


    public void setData(T data) {
        Class dataClazz = data.getClass();

        if(dataClazz == this.clazz){
            this.data = data; return;
        }

        // ここより下追加したけど, 遅くなりそう.
        Class dataSuperClazz = dataClazz.getSuperclass();
        while (dataSuperClazz != null) {
            if(dataSuperClazz == this.clazz) {
                this.data = data; return;
            }
            dataSuperClazz = dataSuperClazz.getSuperclass();
        }

        Class<?>[] interfaces = dataClazz.getInterfaces();
        for (Class<?> interfaze : interfaces) {
            if(interfaze == this.clazz) {
                this.data = data; return;
            }
        }

        // ごめん. いい例外処理見つけられなかった.
        throw new ClassCastException("datagear cannot set class from " + dataClazz.getName() + " to " + clazz.getName());

    }

    public void setClazz(Class clazz){
        this.clazz = WrapperClass.getWrapperClass(clazz);
    };

    public Class getClazz(){
        return clazz;
    };

    public T getData() {
        return data;
    }

    @Override
    public String toString() {
        return "DataGear : classname " + clazz;
    }
}