Java不允许使用泛型调用递归方法吗?

public class ResourceAssembler<T extends BasedEntity> {


    public Resource<T> toResource(T  entity) {
       ExtendsBasedEntity e = getExtendsBasedEntity();
       toResource(e); //<----compile error
       //some other code
    }
}

public class ExtendsBasedEntity extends BasedEntity{}

但是如果你从外面叫它的话

//some other class
new ResourceAssembler<ExtendsBasedEntity>().toResource(new ExtendsBasedEntity())

为什么?

Error:(28,25) java: incompatible types: spring.BasedEntity cannot be converted to T
conandx 回答:Java不允许使用泛型调用递归方法吗?

$Modified = $($(ls 'C:\test.txt').LastWriteTime -gt $enddate);可能不是T,而是ExtendsBasedEntity的某些其他子类型,因此编译错误。

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

BaseEntity

假定对您有用。

,

让我们创建两个扩展terraform plan -out=tfplan terraform show -json tfplan 的类,并分别命名为BasedEntityEBE1
现在,使用EBE2作为类型参数创建一个ResourceAssembly对象。但是,假设在实现EBE1方法时,您会执行类似toResource的操作。

因此,return toResource(new EBE2());的返回类型正在变为toResource(),但这是错误的,因为根据结构,您应该返回Resource<EBE2>。这就是为什么编译时错误。并且Java的类型安全性本能开始发挥作用。

如果要为Resource<EBE1>方法返回泛型,则必须直接传递toResource对象,或者将其更改为要在其中初始化的具体类型。并且不使用泛型(尽管我不知道为什么有人会使用第二个选项,但这是使其成为“编译”状态的“解决方案”)。

此外,在声明时在外面。您没有为entity指定类型参数,因此它是一个原始参数。尝试使用类型参数来实现。您还将在那里有红色的波浪线。

这里是一个示例:

ResourceAssembly

如果您无论如何需要使它按您希望的方式工作,则不要返回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 } ,而是返回Resource<T>,因为您是在通用方法内部递归的,并且看起来您需要一个对象要作为递归调用的参数输入的具体类型。因此这样做很有意义。
否则,请与@Bohemian's approach一起使用,并确保在您使用的类型的类声明中,有一个无参数的构造函数,否则您将拥有Resource<ExtendsBasedEntity>

本文链接:https://www.f2er.com/3141063.html

大家都在问