Discuss / Java / New Bee

New Bee

Topic source

所有操作都是通过子类Dao实例操作,子类实例可以通过继承获取自父类AbstractDao的泛型类型

private Class<T> getParameterizedType() {
    Type type = getClass().getGenericSuperclass();
    if (!(type instanceof ParameterizedType)) {
        throw new IllegalArgumentException("Class " + getClass().getName() + " does not have parameterized type.");
    }
    Type[] types = ((ParameterizedType) type).getActualTypeArguments();
    if (types.length != 1) {
        throw new IllegalArgumentException("Class " + getClass().getName() + " has more than 1 parameterized types.");
    }
    Type r = types[0];
    if (!(r instanceof Class<?>)) {
        throw new IllegalArgumentException("Class " + getClass().getName() + " does not have parameterized type of class.");
    }
    return (Class<T>) r;
}

太感谢了,看见 教程里的 getParameterizedType() 想了挺久,原来如此。发现之前教程反射那章的 “擦拭法” 最后一部分,子类获取父类的泛型类型,也讲了类似的操作。

https://www.liaoxuefeng.com/wiki/1252599548343744/1265104600263968

 Type type = getClass().getGenericSuperclass();

这个不是获取父类class的泛型类型吗?

只能在子类中用,,,怎么父类自己可以获取泛型类型?

约书亚

#4 Created at ... [Delete] [Delete and Lock User]

这个

abstract class AbstractDao<T>

的用途在文中有提到,就是要被其他的DAO继承,然后作为一个特定DAO的数据访问模式,例如

UserDao extends AbstractDao<User>

也就是说这个抽象类就是作为父类,然后子类的构造器被调用的时候,自动在子类当中被调用,也就是获取到了这个泛型类了。


  • 1

Reply