Java泛型。如何正确扩展扩展泛型抽象参数类型类的参数类型类

Java泛型。如何正确扩展扩展泛型抽象参数类型类的参数类型类,java,generics,inheritance,Java,Generics,Inheritance,我有一个泛型抽象超类GenericModel,其方法我希望在子类中调用,如下所示: public abstract class GenericModel<T extends GenericModel> { @Transient protected Class<T> entityClass; public GenericModel() { Class obtainedClass = getClass(); Type genericSuperc

我有一个泛型抽象超类GenericModel,其方法我希望在子类中调用,如下所示:

public abstract class GenericModel<T extends GenericModel> {
    @Transient protected Class<T> entityClass;
    public GenericModel() {
    Class obtainedClass = getClass();
    Type genericSuperclass = null;
    for(;;) {
        genericSuperclass = obtainedClass.getGenericSuperclass();
        if(genericSuperclass instanceof ParameterizedType) {
            break;
        }
        obtainedClass = obtainedClass.getSuperclass();
    }
    ParameterizedType genericSuperclass_ = (ParameterizedType) genericSuperclass;
    entityClass = ((Class) ((Class) genericSuperclass_.getActualTypeArguments()[0]));

    // some code

    public List<T> getByCreationUser_Id(Long id) {
        // method body
        return entities;
    }
}
public class Liability extends Insurance {

}
List<Liability> currentUserInsurances = new Liability().getByCreationUser_Id(1L);
public class Insurance<T> extends GenericModel<Insurance<T>> {}
public class Liability extends Insurance<Liability> {}
以及
责任的对象
I类调用方法:
getByCreationUser_Id()
我想得到
list
而不是T的列表,如下所示:

public abstract class GenericModel<T extends GenericModel> {
    @Transient protected Class<T> entityClass;
    public GenericModel() {
    Class obtainedClass = getClass();
    Type genericSuperclass = null;
    for(;;) {
        genericSuperclass = obtainedClass.getGenericSuperclass();
        if(genericSuperclass instanceof ParameterizedType) {
            break;
        }
        obtainedClass = obtainedClass.getSuperclass();
    }
    ParameterizedType genericSuperclass_ = (ParameterizedType) genericSuperclass;
    entityClass = ((Class) ((Class) genericSuperclass_.getActualTypeArguments()[0]));

    // some code

    public List<T> getByCreationUser_Id(Long id) {
        // method body
        return entities;
    }
}
public class Liability extends Insurance {

}
List<Liability> currentUserInsurances = new Liability().getByCreationUser_Id(1L);
public class Insurance<T> extends GenericModel<Insurance<T>> {}
public class Liability extends Insurance<Liability> {}
List currentUserInsurances=new Liability().getByCreationUser_Id(1L);
不幸的是,我遇到了一个错误:

类型不匹配:无法从列表转换为列表

当我在保险类上调用相同的方法时,我得到一个:
列表

我已经尝试按如下方式声明类:

public abstract class GenericModel<T extends GenericModel> {
    @Transient protected Class<T> entityClass;
    public GenericModel() {
    Class obtainedClass = getClass();
    Type genericSuperclass = null;
    for(;;) {
        genericSuperclass = obtainedClass.getGenericSuperclass();
        if(genericSuperclass instanceof ParameterizedType) {
            break;
        }
        obtainedClass = obtainedClass.getSuperclass();
    }
    ParameterizedType genericSuperclass_ = (ParameterizedType) genericSuperclass;
    entityClass = ((Class) ((Class) genericSuperclass_.getActualTypeArguments()[0]));

    // some code

    public List<T> getByCreationUser_Id(Long id) {
        // method body
        return entities;
    }
}
public class Liability extends Insurance {

}
List<Liability> currentUserInsurances = new Liability().getByCreationUser_Id(1L);
public class Insurance<T> extends GenericModel<Insurance<T>> {}
public class Liability extends Insurance<Liability> {}
公共类保险扩展了GenericModel{}
公共类责任扩展保险{}
但身份证不起作用。出现编译错误


请帮助。

您需要将您的
保险
类别声明为

public class Insurance<T extends Insurance> extends GenericModel<T> {}
public class Liability extends Insurance<Liability> {}

您需要将您的
保险
类别声明为

public class Insurance<T extends Insurance> extends GenericModel<T> {}
public class Liability extends Insurance<Liability> {}

您需要将您的
保险
类别声明为

public class Insurance<T extends Insurance> extends GenericModel<T> {}
public class Liability extends Insurance<Liability> {}

您需要将您的
保险
类别声明为

public class Insurance<T extends Insurance> extends GenericModel<T> {}
public class Liability extends Insurance<Liability> {}


你已经得到了一个很好的答案,我只是想提示你可能想要避免原始类型,所以将你的类声明为GenericModel。你已经得到了一个很好的答案,我只是想提示你可能想要避免原始类型,所以将你的类声明为GenericModel。你已经得到了一个很好的答案,我只是想提示你可能想要避免原始类型,因此,将您的类声明为GenericModel。您已经得到了一个很好的答案,我只是想提示您可能希望避免原始类型,所以将您的类声明为GenericModel。如何初始化此类的java对象?好的,但是我得到了一个错误:
原因:org.hibernate.InstantiationException:无法从JPA实例化测试对象myInsurance.models.Insurance
。你能帮我吗?我想这和hibernate框架有关。我不擅长。但它与泛型无关。您可以使用异常跟踪和相关代码提出新问题。一定要在上面标记hibernate。我已经添加了新帖子。您能告诉我是否可以使用jpa持久化将您的答案中的结构/类声明存储在db中吗?它与jpa无关-只是
genericSuperclass\uuuu.getActualTypeArguments()[0]
将立即为
保险
返回
类型变量
,而不是预期的
。我在你的第二个问题中发布了解决方案。如何初始化这个类的java对象?好的,但我得到一个错误:
,原因是:org.hibernate.InstantiationException:无法从JPA实例化测试对象MyInsurance.models.Insurance
。你能帮我吗?我想这和hibernate框架有关。我不擅长。但它与泛型无关。您可以使用异常跟踪和相关代码提出新问题。一定要在上面标记hibernate。我已经添加了新帖子。您能告诉我是否可以使用jpa持久化将您的答案中的结构/类声明存储在db中吗?它与jpa无关-只是
genericSuperclass\uuuu.getActualTypeArguments()[0]
将立即为
保险
返回
类型变量
,而不是预期的
。我在你的第二个问题中发布了解决方案。如何初始化这个类的java对象?好的,但我得到一个错误:
,原因是:org.hibernate.InstantiationException:无法从JPA实例化测试对象MyInsurance.models.Insurance
。你能帮我吗?我想这和hibernate框架有关。我不擅长。但它与泛型无关。您可以使用异常跟踪和相关代码提出新问题。一定要在上面标记hibernate。我已经添加了新帖子。您能告诉我是否可以使用jpa持久化将您的答案中的结构/类声明存储在db中吗?它与jpa无关-只是
genericSuperclass\uuuu.getActualTypeArguments()[0]
将立即为
保险
返回
类型变量
,而不是预期的
。我在你的第二个问题中发布了解决方案。如何初始化这个类的java对象?好的,但我得到一个错误:
,原因是:org.hibernate.InstantiationException:无法从JPA实例化测试对象MyInsurance.models.Insurance
。你能帮我吗?我想这和hibernate框架有关。我不擅长。但它与泛型无关。您可以使用异常跟踪和相关代码提出新问题。一定要在上面标记hibernate。我已经添加了新帖子。您能告诉我是否可以使用jpa持久化将您的答案中的结构/类声明存储在db中吗?它与jpa无关-只是
genericSuperclass\uuuu.getActualTypeArguments()[0]
将立即为
保险
返回
类型变量
,而不是预期的
。我在你的第二个问题中发布了解决方案。