Java不允许调用泛型类型的递归方法?

Java不允许调用泛型类型的递归方法?,java,generics,types,Java,Generics,Types,让我们创建两个扩展BasedEntity的类,并将它们称为EBE1和EBE2 现在,您可以使用EBE1作为类型参数创建ResourceAssembly对象。但是假设在toResource方法的实现中,您执行类似return-toResource(new EBE2())的操作 因此toResource()的返回类型变为Resource,但这是错误的,因为根据结构,您应该返回Resource。这就是编译时错误的原因。Java的类型安全本能开始发挥作用 如果您想为toResource方法返回泛型,那么

让我们创建两个扩展
BasedEntity
的类,并将它们称为
EBE1
EBE2

现在,您可以使用
EBE1
作为类型参数创建
ResourceAssembly
对象。但是假设在
toResource
方法的实现中,您执行类似
return-toResource(new EBE2())的操作

因此
toResource()
的返回类型变为
Resource
,但这是错误的,因为根据结构,您应该返回
Resource
。这就是编译时错误的原因。Java的类型安全本能开始发挥作用

如果您想为
toResource
方法返回泛型,那么您必须将
实体
对象按原样传递,或者将其更改为您正在初始化的具体类型,而不使用泛型(虽然我不知道为什么会有人使用第二个选项,但这是使其“编译”的“解决方案”).

另外,在外面,当你申报的时候。您没有为
ResourceAssembly
指定类型参数,因此它是原始参数。尝试使用类型参数执行此操作。你也会有红色的曲线

以下是一个例子:

Error:(28, 25) java: incompatible types: spring.BasedEntity cannot be converted to T
静态类资源{
}
静态类基身份{
}
静态类ExtendsBasedEntity1扩展了BasedEntity{
}
静态类ExtendsBasedEntity2扩展了BasedEntity{
}
静态公共类ResourceAssembler{
公共资源存储资源(T实体){

返回到源代码(new ExtendsBasedEntity1());//
T
可能不是
ExtendsBasedEntity
,而是
BaseEntity
的某些其他子类型,因此编译错误

“修复”问题的一种方法是使用类型令牌

公共类ResourceAssembler{
私有最终类类型;
公共资源汇编程序(类类型){
this.type=type;
}
公共资源存储资源(T实体){
toResource(type.newInstance());
//其他代码
}
}

假设这对你有用。

共享
toResource
signature签名就在那里。公共资源toResource(T实体)当从内部调用
#toResource
时,不能保证
T
将是
extendedsbasedentity
。为什么?从内部和外部调用编译器有什么区别?区别在于,当在类内部时,
T
未知,除了它将是
BasedEntity
的某些子类型真正的代码,它实际上不是新对象,而是从另一个类中获取的。在这种情况下,我该如何解决它?编辑question@Bohemian你能告诉我这种方法可以抛出一个
实例化异常的一些方法吗?或者它有可能抛出一个
实例化异常吗?@Shankha057
newInstance()如果没有默认构造函数,
将抛出一个
实例化异常
。@erotsppa你不能“解决”它。除非你有一个类型标记是某种形式,否则你不能知道运行时的实际类型,所以你不能使用任意子类。我需要它在方法内部工作,以便能够调用自己。你知道怎么做吗?谢谢
//some other class
new ResourceAssembler<ExtendsBasedEntity>().toResource(new ExtendsBasedEntity())
Error:(28, 25) java: incompatible types: spring.BasedEntity cannot be converted to T
static class Resource<T> {

}

static class BasedEntity {

}

static class ExtendsBasedEntity1 extends BasedEntity {

}

static class ExtendsBasedEntity2 extends BasedEntity {

}
static public class ResourceAssembler<T extends BasedEntity> {


    public Resource<T> toResource(T entity) {
        return toResource(new ExtendsBasedEntity1()); //<----compile error
    }
}  



    public static void main(String[] args) {
        new ResourceAssembler<ExtendsBasedEntity1>().toResource(new ExtendsBasedEntity1()); // <---- No errors or warnings. This is valid and legal
        new ResourceAssembler<ExtendsBasedEntity2>().toResource(new ExtendsBasedEntity1()); // <----- red squiggly lines here
        new ResourceAssembler().toResource(new ExtendsBasedEntity2()); // <--compiler warning about raw types but no error
    }  
public class ResourceAssembler<T extends BasedEntity> {

    private final Class<T> type;

    public ResourceAssembler(Class<T> type) {
        this.type = type;
    }

    public Resource<T> toResource(T  entity) {
       toResource(type.newInstance());
       //some other code
    }
}