zoukankan      html  css  js  c++  java
  • java 生成泛型的参数的实例 T t=new T()

    方法1

    ParameterizedType ptype = (ParameterizedType) this.getClass().getGenericSuperclass();
            Class clazz = (Class<T>) ptype.getActualTypeArguments()[0];
    T o = (T) clazz.newInstance();

    方法2

    public class BaseViewModel<M extends Model> implements ViewModel {
    
        protected M model;
    
        private M createModel() {
    
            try {
                Type superClass = getClass().getGenericSuperclass();
                Type type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
                Class<?> clazz = getRawType(type);
                return (M) clazz.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
        // type不能直接实例化对象,通过type获取class的类型,然后实例化对象
        public static Class<?> getRawType(Type type) {
            if (type instanceof Class) {
                return (Class) type;
            } else if (type instanceof ParameterizedType) {
                ParameterizedType parameterizedType = (ParameterizedType) type;
                Type rawType = parameterizedType.getRawType();
                return (Class) rawType;
            } else if (type instanceof GenericArrayType) {
                Type componentType = ((GenericArrayType) type).getGenericComponentType();
                return Array.newInstance(getRawType(componentType), 0).getClass();
            } else if (type instanceof TypeVariable) {
                return Object.class;
            } else if (type instanceof WildcardType) {
                return getRawType(((WildcardType) type).getUpperBounds()[0]);
            } else {
                String className = type == null ? "null" : type.getClass().getName();
                throw new IllegalArgumentException("Expected a Class, ParameterizedType, or GenericArrayType, but <" + type + "> is of type " + className);
            }
        }
    
    }
    //上面这个getRawType方法研究了很久,最后查看了Gson的源码发现了这段代码的写法,现分享给大家,希望有帮助。
  • 相关阅读:
    Day1-CSS-下拉菜单
    scau 1138 代码等式
    SCAU-1076 K尾相等数
    勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创)
    SCAU-1144 数星星-HDU-1166-树状数组的应用
    NodeJs Fs模块
    Node核心模块
    flutter环境配置
    纯CSS制作图形效果
    CSS3选择器
  • 原文地址:https://www.cnblogs.com/tiancai/p/9603050.html
Copyright © 2011-2022 走看看